黑马程序员技术交流社区

标题: 循环retain [打印本页]

作者: 野火    时间: 2016-2-1 13:28
标题: 循环retain
本帖最后由 野火 于 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 一下也可以将对象全部释放。





作者: 野火    时间: 2016-2-1 13:39
图是复制过去的,结果挂掉了,还是直接上传图片菜靠谱
作者: 石门一梦    时间: 2016-2-1 15:03
加油!               




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2