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

本文通过探讨iOS开发中引用计数的工作原理,澄清了关于assign、retain和copy操作的常见误解,并深入分析了myObject=aMyObject语句背后的内存管理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       平时在写程序时每当定义一个全局变量时就会小小的纠结一下,到底是要不要给这个变量加上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方法,也避免了循环引用时,对象不能够被回收的问题。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值