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)
能够看到以下内容:
self并且_cmd,它们是每个Objective-C方法中可用的隐藏参数.如果-methodA有正式参数,Block文字也可以看到它们;-methodA是blockSelf,因为它是__block合格的,所以没有保留;块文字不知道(并且在一般情况下,无法察觉)其他函数/方法内部发生的事情,因此块文字不会捕获被调用函数/方法内的任何上下文.您只需要担心定义块文字的方法.
^{}当引用C块(即{})时,我在引用闭包/ lambdas(即)和小写块时使用Apple的大写Block .
| 归档时间: |
|
| 查看次数: |
1259 次 |
| 最近记录: |