我从未参与过非 ARC(自动引用计数)的项目。最近在我的 ARC 项目中遇到了一个僵尸对象。我发现这是由于循环引用导致的。我想知道什么是循环引用。
你能给我举个循环引用的例子吗?
我从未参与过非 ARC(自动引用计数)的项目。最近在我的 ARC 项目中遇到了一个僵尸对象。我发现这是由于循环引用导致的。我想知道什么是循环引用。
你能给我举个循环引用的例子吗?
循环引用是指对象 A
对象保留了对象 B
,而对象 B
同时也保留了对象 A
*。以下是一个例子:
@class Child;
@interface Parent : NSObject {
Child *child; // Instance variables are implicitly __strong
}
@end
@interface Child : NSObject {
Parent *parent;
}
@end
您可以使用__weak
变量或weak
属性来解决ARC中的保留循环问题,用于处理“反向链接”,即对象层次结构中指向直接或间接父级的链接:
@class Child;
@interface Parent : NSObject {
Child *child;
}
@end
@interface Child : NSObject {
__weak Parent *parent;
}
@end
什么是保留循环?当两个对象相互引用并被保留时,就会创建一个保留循环,因为两个对象都试图保留彼此,这使得释放变得不可能。
@class classB;
@interface classA
@property (nonatomic, strong) classB *b;
@end
@class classA;
@interface classB
@property (nonatomic, strong) classA *a;
@end
为了避免ARC引起的保留循环,只需使用weak
引用之一声明它们中的一个,就像这样:@property (nonatomic, weak) classA *a;
foo.bar = bar; bar.foo = foo;
创建了一个保留循环,那么简单的 foo.bar = baz;
就可以打破它,不会产生泄漏。对吧?这是我的理解。 - trss