繁体   English   中英

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

[英]Why does retain cycle leak memory?

我对保留周期有些困惑。如图所示,这是一个保留周期。我的意见是,当超出范围时,test0将释放,obj_将释放,因此对象A和B的引用计数为1 ,同样在test1上发生这种情况时,引用计数将为零,最终释放内存。这是什么问题? 在此处 输入图像描述在 此处 输入图像描述

分配时,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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM