gpt4 book ai didi

objective-c - __block 在 ARC 中的 ivar block 中的自引用循环

转载 作者:太空狗 更新时间:2023-10-30 03:28:18 26 4
gpt4 key购买 nike

我在 block ivar 中得到了一些带有明显引用循环的代码。以下代码会导致引用循环并且永远不会调用 dealloc:

__block MyViewController *blockSelf = self;

loggedInCallback = ^(BOOL success, NSError *error){
if (success)
{
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
{
[blockSelf.delegate loginDidFinish];
});
}
};

但是,如果我创建另一个 __block 变量来保存对我的委托(delegate)的引用,以便捕获 block 的范围,引用循环就会消失:

__block id <MyViewControllerDelegate> blockDelegate = self.delegate;

loggedInCallback = ^(BOOL success, NSError *error){
if (success)
{
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
{
[blockDelegate loginDidFinish];
});
}
};

只是想了解这里发生了什么。

最佳答案

我假设您在这里使用 ARC。在 ARC 之前,您的第一个示例就可以正常工作。在 ARC 中,__block 的语义发生了变化。 __block 声明现在被强捕获,而不是弱捕获。在您的第一个示例中将 __block 替换为 __weak,所有这些都应该按预期工作。

至于第二个示例的工作原理,您正在创建对委托(delegate)的强引用,但您的委托(delegate)没有对对象的引用。因此没有循环,每个人都很开心。

我建议阅读 Mike Ash 关于 ARC 引入的变化的文章,尤其是关于 block 捕获和 __weak http://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html

关于objective-c - __block 在 ARC 中的 ivar block 中的自引用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8915981/

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