Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Weak and strong properties in -viewDidUnload under ARC

I am new to iphone development . I am using ARC for my project. As far as I understood using ARC we don't have to release any object manually. But , I have observed in some places , people explicitly set their object to nil in the ViewDidUnload even after using ARC.

For example, in .h file I have something like this:

@property (unsafe_unretained, nonatomic) IBOutlet MKMapView *mapViewOutlet;
@property (unsafe_unretained, nonatomic) IBOutlet UIToolbar *toolBar;
@property (strong,nonatomic) NSMutableArray *dataArray;

And .m as follows:

- (void)viewDidUnload
{
     [self setMapViewOutlet:nil];
     [self setToolBar:nil];
     [super viewDidUnload];
     self.dataArray=nil;
}

My question is, is it really necessary to explicitly specify nil in the ViewDidUnload even under ARC?

like image 791
Raj Avatar asked Aug 24 '12 06:08

Raj


3 Answers

The whole point of the viewDidUnload method is to release data that you don’t really need, in order to free memory. Read the documentation:

When a low-memory condition occurs and the current view controller’s views are not needed, the system may opt to remove those views from memory. This method is called after the view controller’s view has been released and is your chance to perform any final cleanup. If your view controller stores separate references to the view or its subviews, you should use this method to release those references. You can also use this method to remove references to any objects that you created to support the view but that are no longer needed now that the view is gone. You should not use this method to release user data or any other information that cannot be easily recreated.

So you’re setting the properties to nil in order to release the objects now and help the system to free up some memory. But of course this depends on the property type – strong properties are “yours” and only you can decide whether to release them now (by setting to nil) or not. Weak properties could already be nil, for example if they pointed to some views that got released with the main view. And unsafe_unretained properties are a special beast. The object they point to might already been released, but that does not mean they were set to nil automatically. So you should either use one of the “safer” property types (strong/weak), or set the unsafe properties to nil here, to make sure you won’t use the released object later. There are no hard rules in this case, you have to think about the situation and what it means for the various properties.

By the way, viewDidUnload is getting deprecated in iOS 6, where no views are being released under low-memory conditions anymore. You still receive the didReceiveMemoryWarning callback, so that you can release some resources there if you want to. Again, I suggest that you read the documentation and run a few tests to see what happens and decide what you should do.

like image 164
zoul Avatar answered Oct 24 '22 19:10

zoul


ARC will only release properties which do not hold a strong reference to an object. In your case, these are all strong references, so they will be kept unless they are explicitly set to nil.

The viewDidUnload method does not mean that your UIViewController is removed from memory, it simply means that its views are removed from memory (iOS Developer - ViewController lifecycle).

In this case, your UIViewController remains in memory, and therefore its properties as well, unless they are explicitly set to nil.

like image 43
Resh32 Avatar answered Oct 24 '22 20:10

Resh32


When you are using unsafe_unretained, you should assign it to nil because it will not be assigned to nil implicitly, where is case of weak reference it will be assigned to nil implicitly.So in order to avoid any dangling reference you need to assign to nil in case of unsafe_unretained.

like image 2
Nuzhat Zari Avatar answered Oct 24 '22 19:10

Nuzhat Zari