I know declared property generates accessor method which is someway just syntax sugar.
I found quite a lot people use self.property = nil
in their dealloc
method.
1) In Apple's Memory Management document, p23 It says:
The only places you shouldn’t use accessor methods to set an instance variable are in init methods and dealloc.
why shouldn't?
2) In apple's Objective-C 2.0, p74
Declared properties fundamentally take the place of accessor method declarations; when you synthesize a property, the compiler only creates any absent accessor methods. There is no direct interaction with the
dealloc
method—properties are not automatically released for you. Declared properties do, however, provide a useful way to cross-check the implementation of yourdealloc
method: you can look for all the property declarations in your header file and make sure that object properties not markedassign
are released, and those markedassign
are not released.Note: Typically in a
dealloc
method you shouldrelease
object instance variables directly (rather than invoking a set accessor and passingnil
as the parameter), as illustrated in this example:
- (void)dealloc { [property release]; [super dealloc]; }
If you are using the modern runtime and synthesizing the instance variable, however, you cannot access the instance variable directly, so you must invoke the accessor method:
- (void)dealloc { [self setProperty:nil]; [super dealloc]; }
What does the note mean?
I found [property release];
and [self setProperty:nil];
both work.
Setting a property can lead to notifications being sent to other objects that are observing that property. That could in turn lead to those objects attempting to do something further with your object. If you are in the middle of deallocating, this is probably not what you want to happen. So in general it is safer to release
the relevant instance variable directly.
Note that this sort of problem will only arise in certain cases, so it is often perfectly possible to write code using self.property=nil
in dealloc
and for everything to work out fine. It's just not best practice.
In the Objective-C "modern runtime", it is possible to declare properties without ever specifying the ivar. The runtime will synthesise the storage to go along with the synthesised accessors. In this case you cannot release the ivar directly because as far as your code is concerned there isn't one. So you have no choice but to go the self.property=nil
route.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With