Block的類型
block有三種類型,可以通過調(diào)用class方法或者isa指針查看具體類型,最終都是集成自NSBlock類型
·NSGlobalBlock(_NSConcreteGlobalBlock)
·NSStackBlock(_NSConcreteStackBlock)
·NSMallocBlock(_NSConcreteMallocBlock)

block在內(nèi)存中位置.png
void (^block1)(void) = ^{
NSLog(@"Hello");
};
int age = 10;
void (^block2)(void) = ^{
NSLog(@"Hello - %d", age);
};
NSLog(@"%@ %@ %@", [block1 class], [block2 class], [^{
NSLog(@"%d", age);
} class]);
運(yùn)行結(jié)果
Block[2068:75757] __NSGlobalBlock__ __NSMallocBlock__ __NSStackBlock__
void (^block)(void) = ^{
NSLog(@"Hello");
};
NSLog(@"%@", [block class]);
NSLog(@"%@", [[block class] superclass]);
NSLog(@"%@", [[[block class] superclass] superclass]);
運(yùn)行結(jié)果
Block[2045:73636] __NSGlobalBlock__
Block[2045:73636] NSBlock
Block[2045:73636] NSObject
block的類型怎么區(qū)分呢?

block類型.png
每一種類型的block調(diào)用copy后的結(jié)果

block被copy后.png
在ARC環(huán)境下,編譯器會(huì)根據(jù)情況自動(dòng)將棧上的block復(fù)制到堆上,比如以下情況
·block作為函數(shù)返回值時(shí)
·將block賦值給__strong指針時(shí)
·block作為Cocoa API中方法名含有usingBlock的方法參數(shù)時(shí)
·block作為GCD API的方法參數(shù)時(shí)