为什么保留循环泄漏记忆?

时间:2016-03-19 02:24:31

标签: ios objective-c retain-cycle

我对保留周期有点困惑。如图所示,这是一个保留周期。我的意见是当用完范围时,test0会释放,obj_会释放,所以对象A和B的引用计数将是一个,也就是当这发生在test1上时,那么引用计数将为零,最后,释放内存。问题是什么? enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

分配时,test0由本地引用保留,并且保留计数为1.在调用test1的setObject test0后,保留计数为2.当test0的本地引用超出范围时,test0对象的引用计数减少一,留在一个。 test1也是如此,两者的引用计数均为1。

我认为您可能错误地假设每次对象的保留计数递减时,它所持有的引用都会递减 - 这不是严格正确的。 test0将“保持”其obj,引用计数为1,直到它自己被释放。由于对象相互引用,因此它们的计数永远不会低于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
相关问题