A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 悠悠·漠漠 中级黑马   /  2014-4-20 23:35  /  1079 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

循环引用解决两个对象均不能被释放的采用的是,一端retain一端assign,但是这样的话正如老师前面讲到的如果这个人换卡了,那么原先这张卡对象内存不就不会被释放了吗?求指点是否哪里理解有误了!

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

2 个回复

倒序浏览
是不会释放的,拿代码给你解释吧,光说估计你不会明白的。。
条件如下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】
这样原先这张卡的对象内存就会释放

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
D调的沉默 发表于 2014-4-21 11:52
是不会释放的,拿代码给你解释吧,光说估计你不会明白的。。
条件如下card端的@property person设置为assig ...

不太赞同你的说法,
  1. Person *p=[[person alloc] init];
  2. Card *c1=[[Car alloc] init];
  3. Card *c2=[[Car alloc] init];
  4. p.card=c1;//此时人拥有这张卡,对c1做一次retain
  5. p.card=c2;//此时人换卡,按循环引用的解决方案是一个assign一个retain,那么此时不会对c1做release,而再对c2最一次retain
  6. [c1 release];//此时对c1做一次release,c1的计数器为1
  7. [c2 release];//此时对c2做一次release,c2的计数器为1
  8. [p release];//p对象被回收,执行dealloc方法,调用[_car release],对当前人拥有的卡c2做一次release至此c2被回收,但是c1没有被回收
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马