A1) [nil release] is fine (won’t do anything)
A2) No. Don’t touch objects after they’ve been deallocated. They should be set to nil after they are released.
A3) It’s not necessary to set a released pointer to nil, but you get dangling pointers (i.e., you can’t tell if an object is valid or not). Setting a property to nil is often used to release the underlying ivar, so failing to do this can cause a memory leak
A4) nil and NULL are both zero, so are technically the same.
A5) Yes, you must use self.someProperty for properties, just as you would use [self someProperty] if it was just a method
A6) self is essentially a struct, so you can access ivars like so: self->someIvar. There is no need to, though.
A7) When you don’t want to run the setter/getter methods for whatever reason. I use it ocassionally when the setter doesn’t allow nil values, and I need to release the variable
A8) dealloc is called automatically when release is called the correct amount of times. You should never call dealloc directly (except for [super dealloc])