来自被调用方法的块和自我

Tom*_*Tom 9 memory-management objective-c objective-c-blocks

好的,所以我理解如何避免self使用块保留循环,当我从一个块中的方法向嵌入更深层的方法向自己发送消息的情况如下:

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

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

- (void)methodC {
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下[blockSelf methodB]是好的,但在发送[self methodC]methodB造成保留周期或不?在任何地方找不到答案......

小智 8

那里没有保留周期.在方法内定义块文字时,块可以捕获的上下文仅限于该方法中可见的内容.在你的例子中:

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

块文字,即:

^{
    [blockSelf methodB];
}
Run Code Online (Sandbox Code Playgroud)

能够看到以下内容:

  1. self并且_cmd,它们是每个Objective-C方法中可用的隐藏参数.如果-methodA有正式参数,Block文字也可以看到它们;
  2. 函数/方法块内的任何块范围变量,即方法内的每个局部变量,并且在定义块文字的位置可见.在这个例子中,里面唯一的局部变量-methodAblockSelf,因为它是__block合格的,所以没有保留;
  3. 任何文件范围变量(也称为全局变量).

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

^{}当引用C块(即{})时,我在引用闭包/ lambdas(即)和小写块时使用Apple的大写Block .