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),不影响另一个。如下两个图,比较可知:


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


如果你开了: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的。


展开阅读全文

没有更多推荐了,返回首页