Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iPhone - dealloc - Release vs. nil

Tags:

Wondering if someone with experience could possibly explain this a bit more. I have seen examples of...

  [view release];    view = nil;   

....inside the (void) dealloc.

What is the difference and is one better then the other? What is the best way?

When doing retainCount testing I have personally seen nil drop a count from 3 to 0 for me, but release only drops it from 3 to 2.

like image 434
bbullis21 Avatar asked Sep 22 '09 05:09

bbullis21


2 Answers

What you have seen is probably these:

1) [foo release]; 2) self.bar = nil; 3) baz = nil; 
  1. Is releasing the object, accessing it through the instance variable foo. The instance variable will become a dangling pointer. This is the preferred method in dealloc.

  2. Is assigning nil to a property bar on self, that will in practice release whatever the property is currently retaining. Do this if you have a custom setter for the property, that is supposed to cleanup more than just the instance variable backing the property.

  3. Will overwrite the pointer baz referencing the object with nil, but not release the object. The result is a memory leak. Never do this.

like image 96
PeyloW Avatar answered Oct 05 '22 06:10

PeyloW


If you are not using properties (where self.property = nil will also release an object) then you should ALWAYS follow a release by code that sets the reference to nil, as you outlined:

[view release]; view = nil; 

The reason is that it avoids he possibility that a reference can be used that is invalid. It's rare and hard to have happen, but it can occur.

This is even more important in viewDidUnload, if you are freeing IBOutlets - that's a more realistic scenario where a reference might go bad because of memory warnings unloading a view, and then some other code in the view trying to make use of a reference before the view is reloaded.

Basically it's just good practice and it will save you a crash at some point if you make it a habit to do this.

like image 40
Kendall Helmstetter Gelner Avatar answered Oct 05 '22 07:10

Kendall Helmstetter Gelner