黑马程序员技术交流社区
标题:
循环引用
[打印本页]
作者:
悠悠·漠漠
时间:
2014-4-20 23:35
标题:
循环引用
循环引用解决两个对象均不能被释放的采用的是,一端retain一端assign,但是这样的话正如老师前面讲到的如果这个人换卡了,那么原先这张卡对象内存不就不会被释放了吗?求指点是否哪里理解有误了!
作者:
D调的沉默
时间:
2014-4-21 11:52
是不会释放的,拿代码给你解释吧,光说估计你不会明白的。。
条件如下card端的@property person设置为assign
person *p=[[person alloc] init];
card *c =[[card alloc] init];//c 一引用计数器ref=1
p.card=c;//p端用retain c的引用计数器ref=2但是p在释放时,内部delloc会调用【c release一次】
card *c1=[[card alloc] init];
p.card=c1;
老师说过谁申请的谁负责,对于一个alloc就要有一次release,所以在结尾你要写上【c release】
这样原先这张卡的对象内存就会释放
作者:
悠悠·漠漠
时间:
2014-4-22 21:09
D调的沉默 发表于 2014-4-21 11:52
是不会释放的,拿代码给你解释吧,光说估计你不会明白的。。
条件如下card端的@property person设置为assig ...
不太赞同你的说法,
Person *p=[[person alloc] init];
Card *c1=[[Car alloc] init];
Card *c2=[[Car alloc] init];
p.card=c1;//此时人拥有这张卡,对c1做一次retain
p.card=c2;//此时人换卡,按循环引用的解决方案是一个assign一个retain,那么此时不会对c1做release,而再对c2最一次retain
[c1 release];//此时对c1做一次release,c1的计数器为1
[c2 release];//此时对c2做一次release,c2的计数器为1
[p release];//p对象被回收,执行dealloc方法,调用[_car release],对当前人拥有的卡c2做一次release至此c2被回收,但是c1没有被回收
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2