为啥保留循环泄漏内存?

Posted

技术标签:

【中文标题】为啥保留循环泄漏内存?【英文标题】: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

【问题讨论】:

【参考方案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,直到它自己被释放。你的意思是“直到它本身被释放”。

以上是关于为啥保留循环泄漏内存?的主要内容,如果未能解决你的问题,请参考以下文章

此 CAAnimation 会导致泄漏或保留周期吗?

哪些操作会造成内存泄漏?

爱创课堂每日一题101天-哪些操作会造成内存泄漏?

爱创课堂每日一题第五十三天- 哪些操作会造成内存泄漏?

Java 标准 API 中的内存泄漏陷阱

为啥苹果提供的 SimpleFTPSample 会泄漏内存?