[英]Why does retain cycle leak memory?
分配时,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.