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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 野火 中级黑马   /  2016-2-1 13:28  /  1106 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 野火 于 2016-2-1 13:43 编辑

1 两个类相互引用,会发生循环引用,编译器会报错,用@class导入类可以解决。

2 @class导入后,两个对象相互指向会发生循环retain

3   解决的方法是一个个对象@property 中的参数用retain ,一个对象的@property 中的参数用assgin

@property 的作用是自动生成set和get方法,如果括号中的参数是assgin代表,set 方法中是直接的

赋值。一般用于基本数据类型,而retain 是在set方法中先将实例变量 release 然后在retain。

(1)如果都是retain,情况如下:





两个对象都无法释放导致内存泄漏。

泄漏的原理如下图:


  


创建对象后,person 和 dog 的对象的引用计数分别是1 ,然后使用
set方法后,引用计数都是2,当p 执行release的时候,p.retainCount = 1
d.retainCount = 1.然后程序便结束,栈中的*p  和 *d 相继释放,但是在堆内存红还存在两个空间再相互应用,从而导致内存泄漏。


(2)使用解是一个对象@property 中的参数用retain ,一个对象的@property 中的参数用assgin







创建完对象后,p 的引用计数和 d 的引用计数都是1 ,然后,p 使用set 后 d 的引用计数为2 (p 是retain),d 也使用了set 但是   p 的引用计数是 1(d 是 assgin).然后 [d release],d.retainCount = 1
再 [p release] ,p.retainCount =  0 ,然后调用  p 的 dealloc  方法,再调用 [d release],d.retainCount = 0;对象全部释放没有内存泄漏。



(3)在(2)中的将 某个过对象多release 一下也可以将对象全部释放。




2 个回复

倒序浏览
图是复制过去的,结果挂掉了,还是直接上传图片菜靠谱
回复 使用道具 举报
石门一梦 来自手机 中级黑马 2016-2-1 15:03:13
藤椅
加油!               
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马