Objective-C 为什么需要 __NSGlobalBlock__

ajj*_*nix 5 objective-c objective-c-blocks

如果我的块没有捕获变量,我会得到__NSGlobalBlock__.

Class class = [^{
} class];
NSLog(@"%@", NSStringFromClass(class));
Run Code Online (Sandbox Code Playgroud)

但是,如果我捕获变量,我会得到 __NSStackBlock__

int foo = 3;
Class class = [^{
    int foo1 = foo;
} class];
NSLog(@"%@", NSStringFromClass(class));
Run Code Online (Sandbox Code Playgroud)

为什么需要在全局内存中阻塞?__NSGlobalBlock__对比什么优势__NSStackBlock__

我阅读了Block Implementation Specification,但我不明白为什么__NSGlobalBlock__我只为一种用途创建块。

Avi*_*Avi 2

GlobalStack引用定义块时捕获的数据所在的位置。如果一个块是Global运行时知道不需要进行进一步的处理。诸如此类的事情copy变得不可操作。如果块是Stack,则运行时会知道如果数据在释放块之前超出范围,则需要移动数据。这对于 ARC 来说尤其重要。