`我承认我不是 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
block 被注释掉,我看到我的 Foo dealloc
在 foo 设置为 nil
后立即被调用。注释掉 block 后,foo 的 delloc
不会被调用。
我的保留周期正确吗?知道怎么做吗?
最佳答案
不,您不一定有保留循环(现在在 ARC 中称为“强引用循环”)。你有这样的代码,如果在定义 strongSelf
时 foo
已经存在,则 foo
将被保留,直到分派(dispatch)的代码完成。
这里唯一潜在的强引用循环是您传递给 foo
的 delegate
。如果该 delegate
被定义为 Foo
类的 strong
属性,那么您就有了一个强引用循环。如果它被定义为 weak
属性,那么您就没有强引用循环。
关于ios - 即使在使用弱/强 ARC 语义时也保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25770057/