平时在写程序时每当定义一个全局变量时就会小小的纠结一下,到底是要不要给这个变量加上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方法,也避免了循环引用时,对象不能够被回收的问题。
(第一次来写博客,还希望各位看官多多指教。)