iOS block的类型

block:栈块、堆块、全局块。

1.栈块

#import 
static void logBlockClassName(void (^block)())
{
    NSLog(@"block class: %@", NSStringFromClass([block class]));
}
int main(int argc, const char* argv[])
{
    @autoreleasepool
    {
        // block 0
        logBlockClassName(^{
        });
        // block 1
        int a = 0;
        logBlockClassName(^{
            NSLog(@"%d\n", (int)a);
        });
        // block 2
        void (^block)() = ^{
            NSLog(@"%d\n", (int)a);
        };
        logBlockClassName(block);
    }
    return 0;
}
这个程序,在 ARC下,打印出
2014-05-29 17:25:20.386 Test[8725:303] block class: __NSGlobalBlock__
2014-05-29 17:25:20.387 Test[8725:303] block class: __NSStackBlock__
2014-05-29 17:25:20.388 Test[8725:303] block class: __NSMallocBlock__
在非ARC下面,打印出
2014-05-29 17:27:58.913 Test[8755:303] block class: __NSGlobalBlock__
2014-05-29 17:27:58.914 Test[8755:303] block class: __NSStackBlock__
2014-05-29 17:27:58.914 Test[8755:303] block class: __NSStackBlock__

NSGlobalBlock 表示这个block是全局分配的。block里面没有使用外部变量,就会是这种类型,相当于一个全局函数。
NSStackBlock 表示这个block, 是在栈上面分配的,出了栈就会消亡。使用了外部变量。比如例子的block 1, 使用了变量 a。
NSMallocBlock 表示block复制到堆上面了,可以存储下来,以后使用。
在ARC的情况下。只要将block赋值给变量,就自动帮你复制了。而非ARC的情况下,就不会。所以例子中的,block 2, ARC下,类型为 NSMallocBlock,而非ARC下,类型为 NSStackBlock

你可能感兴趣的:(iOS block的类型)