即使使用弱/强ARC语义,也能保留周期

时间:2014-09-10 16:02:28

标签: ios objective-c automatic-ref-counting retain-cycle

`我承认我不是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未被调用。

我的保留周期是否正确?知道怎么样?

1 个答案:

答案 0 :(得分:2)

不,您不一定有保留周期(现在称为"强参考周期"在ARC中)。您有一些代码,如果在定义foo之前存在strongSelf,则foo将一直保留,直到调度的代码完成为止。

此处唯一潜在的强参考周期是您传递给delegate的{​​{1}}。如果foo被定义为delegate类的strong属性,则您具有强大的引用周期。如果它被定义为Foo属性,那么您没有强大的参考周期。