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;
}
這個(gè)程序悬垃,在 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 表示這個(gè)block是全局分配的尝蠕。block里面沒(méi)有使用外部變量,就會(huì)是這種類型载庭,相當(dāng)于一個(gè)全局函數(shù)看彼。
NSStackBlock 表示這個(gè)block, 是在棧上面分配的廊佩,出了棧就會(huì)消亡。使用了外部變量靖榕。比如例子的block 1, 使用了變量 a标锄。
NSMallocBlock 表示block復(fù)制到堆上面了,可以存儲(chǔ)下來(lái)茁计,以后使用料皇。
在ARC的情況下。只要將block賦值給變量星压,就自動(dòng)幫你復(fù)制了践剂。而非ARC的情況下,就不會(huì)租幕。所以例子中的,block 2, ARC下拧簸,類型為 NSMallocBlock劲绪,而非ARC下,類型為 NSStackBlock盆赤。