Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any problem using self.property = nil in dealloc?

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 your dealloc method: you can look for all the property declarations in your header file and make sure that object properties not marked assign are released, and those marked assign are not released.

Note: Typically in a dealloc method you should release object instance variables directly (rather than invoking a set accessor and passing nil 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.

like image 203
Jimmy Avatar asked Apr 11 '11 12:04

Jimmy


1 Answers

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.

like image 77
walkytalky Avatar answered Oct 31 '22 02:10

walkytalky