繁体   English   中英

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

[英]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中称为“强参考周期”)。 您有这样的代码,如果在定义strongSelffoo已经存在,则foo将保留直到调度的代码完成为止。

这里唯一可能的强参考循环是您传递给foodelegate 如果delegate定义为strong的财产Foo类,那么你有很强的参考周期。 如果将其定义为weak属性,则您没有强参考周期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM