【问题标题】:Why does retain cycle leak memory?为什么保留循环泄漏内存?
【发布时间】:2016-03-19 02:24:31
【问题描述】:

我对retain循环有点困惑。如图所示,这是一个retain循环。我的看法是当超出范围时,test0会释放,obj_会释放,所以对象A和B的引用计数将是一,当 test1 发生这种情况时,引用计数将为零,最后释放内存。有什么问题? enter image description here enter image description here

【问题讨论】:

    标签: ios objective-c retain-cycle


    【解决方案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
    

    【讨论】:

    • 非常感谢,之前我想当用完范围时,test0会释放,它的obj也会释放。事实是obj只有在对象释放时才会释放。
    • "test0 将“持有”它的 obj,引用计数为 1,直到它自己被释放。你的意思是“直到它本身被释放”。
    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 2011-01-12
    • 2014-07-04
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多