1、当两个类相互包含的时候,比如 Person.h 中包含 Book.h,而 Book.h 中又包含 Person.h。这个时候就会出现循环引用的问题,造成程序无限递归,从而导致编译无法通过。
2、解决方案
其中一边不要使用 #import 来引入对方的头文件。
而是使用 @class 类名;来标注这是一个类。这样就可以在不引入对方头文件的情况下,告诉编译器这是一个类。
在 .m 文件中再 #import 对方的头文件,这样就可以使用了
3、#import 和 @class 的区别
- #import 是将指定的文件内容在预编译的时候拷贝到写指令的地方。
- @class 并不会拷贝任何内容,只是告诉编译器这是一个类。这样编译器在编译的时候才可以知道这是一个类。
4、在 MRC 的情况下,当两个对象相互引用的时候。(当 A 对象的属性是 B 对象,B 对象的属性是 A 对象。此时如果两边都使用 retain 的话,就会发生内存泄露)
5、解决方案
- 一端使用 retain,另一端使用 assign,使用 assign 的那一端在 dealloc 方法中就不再需要 release 了。
6、在 ARC 的情况下,当两个对象相互引用的时候,并且属性的类型都是 OC 对象,如果此时两边都使用 strong 的话,就会发生内存泄漏。
7、解决方案
- 一端使用 strong,另一端使用 assign。