It's not necessary to have your IVars declared explicitly. I'd even recommend omitting them because you should ALWAYS access IVars via accessors (as you pointed out what you already do.)
You will not run in any problems, except that the debugger doesn't catch the IVars directly anymore (they won't display nicely next to your console.) - But that's not really an issue.
In your dealloc method you will not need to release them anymore. What you will need to do is nil them.
self.obj = nil;
--
Here's a brief overview of what the property attributes actually mean:
(That's to show you that a release happens when you nil a variable in the dealloc)
assign
@property (assign) NSString *name;
name = newValue;
retain
@property (retain) NSString *name;
if (name != newValue) {
[name release];
name = [newValue retain];
}
copy
@property (copy) NSString *name;
if (name != newValue) {
[name release];
name = [newValue copy];
}