[英]Retain Cycle Even when using Weak/Strong ARC Semantics
`我承认我不是ARC的专家,并通过一些研究和一些伟大的物品(如虽然保留周期这个 ),我相信我得到的基本知识。
但是,我目前很困惑。 我有一个定义如下的属性。
@property (nonatomic,retain) Foo *foo;
在我的init
内部,执行以下操作。
if(self = [super init]) {
_foo = [[Foo alloc] initWithDelegate:self];
// async the rest
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
__strong typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf.foo != nil) {
[strongSelf.foo runTests];
}
});
}
return self;
}
这是我的dealloc
- (void)dealloc {
_foo = nil;
}
如果将dispatch_aync
块注释掉,我会在foo设置为nil
后立即调用Foo dealloc
。 在注释了该块的delloc
下,不调用foo的delloc
。
我的保留周期正确吗? 任何想法如何?
不,您不一定有保留周期(在ARC中称为“强参考周期”)。 您有这样的代码,如果在定义strongSelf
时foo
已经存在,则foo
将保留直到调度的代码完成为止。
这里唯一可能的强参考循环是您传递给foo
的delegate
。 如果delegate
定义为strong
的财产Foo
类,那么你有很强的参考周期。 如果将其定义为weak
属性,则您没有强参考周期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.