IOS引用计数也许并不是你想的那样
2013-09-23 22:40
127 查看
平时在写程序时每当定义一个全局变量时就会小小的纠结一下,到底是要不要给这个变量加上property,所以就google了一下IOS property,找到这篇文章讲解的还是挺细致的:http://mobile.51cto.com/iphone-313096.htm,刚开始IOS开发,被property和synthesize弄迷糊的小伙伴可以好好看一下。但这篇文章中以下部分的注释让我很迷糊:
我在开始做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方法,也避免了循环引用时,对象不能够被回收的问题。
(第一次来写博客,还希望各位看官多多指教。)
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方法,也避免了循环引用时,对象不能够被回收的问题。
(第一次来写博客,还希望各位看官多多指教。)
相关文章推荐
- ios 开发,并不是我们想象的那样难
- 也许不是你想的那样-- Exchange 2003 邮件大小限制
- IOS开发错误记录之Quartz绘图出来不是线而是点的原因
- 学位的重要性(PS:学位也许将来不是那么重要的)
- 那些定格上演着一幕一幕,也许会有烟花那样一瞬间的美丽
- 在数据库中能不能像用excel那样直接填表保存进数据库,而不是用SQL语句
- ios tableView reload不是异步
- MFC有时候也不是那样的神,关键时候还是自己写的好,今天早上遇到的状况下面是解决
- iOS-引用计数与ARC(转)
- android 沉浸式状态栏(像ios那样的状态栏与应用统一颜色样式)
- 不是没有答案,也许是发问的方式不对
- iOS 工作之余小总结(三) 拷贝----浅拷贝,深拷贝(copy),引用计数拷贝及区别
- ESB并不是那样
- ios影视项目解析 主要为讲block的细节 如果了解了 block的定义等 但是对运用不是很熟悉可以参考本文章
- ios系统提示音的使用(不是铃声)
- ios开发答疑录系列--xcode 的target总是“My Mac 64-bit” 而不是 simulator or device
- android 沉浸式状态栏(像ios那样的状态栏与应用统一颜色样式)
- IOS开发之——登录加密也许用到的,反转字符串
- 灯红酒绿的伤感空间日志:也许,我们都不是真正的快乐
- android 沉浸式状态栏(像ios那样的状态栏与应用统一颜色样式)