gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:38:26 27 4
gpt4 key购买 nike

`我承认我不是 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com