现在的位置: 首页 > 综合 > 正文

IOS引用计数也许并不是你想的那样

2017年08月17日 ⁄ 综合 ⁄ 共 1305字 ⁄ 字号 评论关闭

       平时在写程序时每当定义一个全局变量时就会小小的纠结一下,到底是要不要给这个变量加上property,所以就google了一下IOS property,找到这篇文章讲解的还是挺细致的:http://mobile.51cto.com/iphone-313096.htm,刚开始IOS开发,被property和synthesize弄迷糊的小伙伴可以好好看一下。但这篇文章中以下部分的注释让我很迷糊:

MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1; 
myObject = aMyObject; //myObject retainCount = 1; 
[aMyObject release];//对象己经被释放

我在开始做IOS开发时就是使用Xcode4,IOS5已经很普遍了,所以程序一直是启用ARC的,对IOS的引用计数了解的也不是很清楚,正好最近在看内存管理方面的东西,所以打算一探究竟。

      先说说我感到迷糊的地方吧,myObject = aMyObject后,对于对象的引用应该是2啊,因为有两个指针指向了[[MyObject alloc]init]这个对象。在内存里的样子如下:


尤其是看到了这篇文章:http://www.codeios.com/thread-1845-1-1.html,我就更迷糊了,他就是用这内存里的情况解释的assign,retain,copy的,按照他对retain的解释,那myObject = aMyObject后,对象的引用计数肯定是2了。但之前的那篇文章解释到“只是一般的赋值,
把一个指针赋给另一个指针, 不会对分配的内存有任何影响
”,而且很多地方都是这样解释的。并且如果真的是2了,那还要retain这个方法干什么呢。接下来,我以为我搞错了,myObject = aMyObject后,两个本身的地址是一样的呢,如果是这样那就有一个指针指向堆里的对象了。可我用&取两个变量的地址得到的值不一样,纠结啊。。。。。

      最后又看了一下《Pro Multithreading and Memory Management for iOS and OSX with ARC Grand Central Dispatch and Blocks》,里面这样解释的retain方法:

  
    

可以看到,IOS里是给创建的对象头部放一节点存储它的引用计数,调用retain方法将这个引用计数加1,调用release方法将这个引用计数减1,调用assign方法不变。myObject
= aMyObject就相当于调用assign方法。

综上,不要把IOS里的引用计数理解成了有几个指针指向对象,引用计数就是几。想想也是,我们让两个变量相等,总要告诉编译器是怎么个相等法。如果是retain方式的,那aMyObject不用堆里的那个对象了,myObject还可以接着用。如果是assign方式,aMyObject不用了,myObject也就不能用了。所以这样设置后,有了assign方法,也避免了循环引用时,对象不能够被回收的问题。

(第一次来写博客,还希望各位看官多多指教。)

抱歉!评论已关闭.