ios - 即使在使用弱/强 ARC 语义时也保留循环

标签 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 block 被注释掉,我看到我的 Foo dealloc 在 foo 设置为 nil 后立即被调用。注释掉 block 后,foo 的 delloc 不会被调用。

我的保留周期正确吗?知道怎么做吗?

最佳答案

不,您不一定有保留循环(现在在 ARC 中称为“强引用循环”)。你有这样的代码,如果在定义 strongSelffoo 已经存在,则 foo 将被保留,直到分派(dispatch)的代码完成。

这里唯一潜在的强引用循环是您传递给 foodelegate。如果该 delegate 被定义为 Foo 类的 strong 属性,那么您就有了一个强引用循环。如果它被定义为 weak 属性,那么您就没有强引用循环。

关于ios - 即使在使用弱/强 ARC 语义时也保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25770057/

相关文章:

IOS 以编程方式将应用程序移动到主屏幕的文件夹中

ios - RACCommand 初始值设定项信号未命中 executingSignals

ios - 如何让 UITextField 先全选然后以编程方式编辑?

ios - xcconfig 文件中的 info.plist 键名

ios - 为什么在iOS7中UIWebView canGoBack=NO?

iphone - UIView drawRect 绘图线宽度错误

ios - 如何使用 ARC 将 delegate 替换为 block

iOS 内存使用量增加直至崩溃

ios - ARC是否管理CGPDF类型的内存?

iphone - 如何使用 OS 3.1 MapKit 实现可拖动的引脚?