我对保留周期有些困惑。如图所示,这是一个保留周期。我的意见是,当超出范围时,test0将释放,obj_将释放,因此对象A和B的引用计数为1 ,同样在test1上发生这种情况时,则引用计数将为零,最终释放内存。这是什么问题?
enter image description here
enter image description here
最佳答案
分配时,test0被本地引用保留,保留计数为1。调用test1的setObject test0时,保留计数为2。当test0的本地引用超出范围时,test0对象的引用计数递减1,从而保留它合而为一。 test1也是如此,两者的参考计数均为1。
我认为您可能会错误地假设,每次对象的保留计数递减时,它所保存的引用都会递减-严格地说,这不是真的。 test0将“保留”其引用计数为1的obj,直到其自身释放为止。由于对象彼此引用,因此它们的计数永远不会低于1。
@interface Test : NSObject
{
id __strong obj_;
}
-(void)setObject:(id __strong) obj_;
@end
@implementation Test
-(id)init
{
self=[super init];
return self;
}
-(void)setObject:(id __strong) obj
{
obj_ = obj;
}
@end
// ...
id test0 = [[Test alloc] init];
NSLog(@"test0 etain count is %ld", CFGetRetainCount((__bridge CFTypeRef)test0)); // 1
id test1 = [[Test alloc] init];
[test0 setObject: test1];
[test1 setObject: test0];
NSLog(@"test0 retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)test0)); // 2