block:栈块、堆块、全局块。
1.栈块
#import <Foundation/Foundation.h>
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。