iOS 释放内存/指针清空(release/=nil)深度讨论

(1)release/=nil,前后顺序是可以随便用。并且=nil是可以用无数次。
事实: Object *object=[[Object alloc] init];
[object release];
object=nil;
object=nil;
object=nil;
……
object=nil; //都不会报错。
事实: Object *object=[[Object alloc] init];
object=nil;
[object release]; //也不会报错。
[object release]; //也不会报错。
[object release]; //也不会报错。
[object release]; //也不会报错。
[object release]; //也不会报错。
[object release]; //也不会报错。*指针一定要为空,release才可以用无数次。
(2)两个指针指向同一个对象,其中一个指针清空(=nil),不影响另一个。如下两个图,比较可知:
iOS 释放内存/指针清空(release/=nil)深度讨论
文章图片


(3)两个指针指向同一个对象,其中一个释放内存【即retainCount - 1】(release),影响另一个。如果引用到另一个指针的话会报错:

iOS 释放内存/指针清空(release/=nil)深度讨论
文章图片


【iOS 释放内存/指针清空(release/=nil)深度讨论】
如果你开了:NSZombieEnabled,引用被释放的对象时,报错如下:*** -[objcect respondsToSelector:] message sent to deallocated instance 0x6a109f0
(注意:containObject.delegate 的setter方法是assign)
**************************************************************************************************
对比一:
①调用[objcet release]后,指针仍然指向内存块:0x6a109f0
②而调用object=nil(containObject.delegate=nil)后,指针不指向任何内存块,即内存地址:0x0
**************************************************************************************************
对比二:
①引用一个retainCount=0的指针,是出错的:
[object release];
NSLog(@"%@",object); //出错
②引用一个内存地址:0x0的指针,是不会出错的:
object=nil;
NSLog(@"%@",object); //不出错
*************************************************************************************************
嘘……下面我来一个高度的概括,连苹果官网都没我这个概括那么概括。千万不要告诉人家(不过你告诉人家,我也没办法,不绝对不会追究知识产权的)。
一个指针调用 release 函数,是会影响到所有指向同一对象的指针。总的来说,释放内存(rlease)方面,所有的指针是Shared的。
一个指针=nil,只会影响到本身,不会影响到所有指向同一对象的其它指针。总的来说,指针清空(=nil)方面,所有的指针是Independent的。

    推荐阅读