本帖最后由 野火 于 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 一下也可以将对象全部释放。
|