`我承认我不是ARC的专家,通过一些研究和一些好文章(如this)保留周期,我相信我得到了基础知识。
然而,我目前难倒。我有一个属性定义如下。
@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设置为dealloc
后立即调用我的Foo nil
。在块中注释,foo的delloc
未被调用。
我的保留周期是否正确?知道怎么样?
答案 0 :(得分:2)
不,您不一定有保留周期(现在称为"强参考周期"在ARC中)。您有一些代码,如果在定义foo
之前存在strongSelf
,则foo
将一直保留,直到调度的代码完成为止。
此处唯一潜在的强参考周期是您传递给delegate
的{{1}}。如果foo
被定义为delegate
类的strong
属性,则您具有强大的引用周期。如果它被定义为Foo
属性,那么您没有强大的参考周期。