循环引用是指两个或两个以上对象互相强引用,导致所用对象无法被释放的现象。这是内存泄露的一种情况。例如下面的例子:
=== class Father ===
@interface Father: NSObject
@property (strong, nonatomic) Son *son;
@end
=== class Son ===
@interface Son:NSObject
@property (strong, nonatomic) Father *father;
上述代码有两个类,分别为爸爸(Father)和儿子(Son)。爸爸对儿子强引用,儿子对爸爸强引用。所以,要释放儿子必须先释放爸爸,要释放爸爸,则必须先释放儿子,如此一来,两个对象都无法被释放。
解决方法是将Father中的Son对象属性由strong改为weak。
加分回答:
内存泄露可以用Xcode中的Debug Memory Craph 检查,如图3-1所示。(iOS面试之道里面的图)
同时,Xcode也会在Runtime 中自动汇报内存泄露问题,如图3-2所示。(iOS面试之道里面的图)
网友评论