gpt4 book ai didi

objective-c - 来自被调用方法的 block 和自身

转载 作者:太空狗 更新时间:2023-10-30 03:29:12 27 4
gpt4 key购买 nike

好的,所以我明白了如何避免 self 与 block 的保留循环,当我从嵌套在调用堆栈中更深的 block 中的方法向 self 发送消息的情况如何:

- (void)methodA {
__block MyClass *blockSelf = self;
[someObject block:^{
[blockSelf methodB];
}];
}

- (void)methodB {
...
[self methodC];
...
}

- (void)methodC {
}

在这种情况下 [blockSelf methodB] 没问题,但是从 methodB 发送 [self methodC] 是否会导致保留周期?在任何地方都找不到答案...

最佳答案

那里没有保留循环。当在方法内部定义 Block 文字时,Block 可以捕获的上下文仅限于在该方法内部可见的内容。在您的示例中:

- (void)methodA {
__block MyClass *blockSelf = self;
[someObject block:^{
[blockSelf methodB];
}];
}

block 文字,即:

^{
[blockSelf methodB];
}

能够看到以下内容:

  1. self_cmd,它们是每个 Objective-C 方法中可用的隐藏参数。如果 -methodA 有形式参数,Block literal 也能看到它们;
  2. 函数/方法 block 内的任何 block 作用域变量,即方法内的每个局部变量,并且在定义 block 文字的位置处可见。在示例中,-methodA 中唯一的局部变量是 blockSelf,因为它是 __block 限定的,所以不会保留;
  3. 任何文件范围变量(又名全局变量)。

block 字面量不知道(并且在一般情况下,无法知道)其他函数/方法内部发生的事情,因此 block 字面量不会捕获被调用函数/方法内部可用的任何上下文。您只需要担心定义 Block 文字的方法。

我在引用闭包/lambdas(即 ^{})时使用 Apple 的大写 Block 惯例,在引用 C block (即 { }).

关于objective-c - 来自被调用方法的 block 和自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8353502/

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