Block的类型
block有三种类型,可以通过调用class方法或者isa指针查看具体类型,最终都是集成自NSBlock类型
·NSGlobalBlock(_NSConcreteGlobalBlock)
·NSStackBlock(_NSConcreteStackBlock)
·NSMallocBlock(_NSConcreteMallocBlock)
void (^block1)(void) = ^{
NSLog(@"Hello");
};
int age = 10;
void (^block2)(void) = ^{
NSLog(@"Hello - %d", age);
};
NSLog(@"%@ %@ %@", [block1 class], [block2 class], [^{
NSLog(@"%d", age);
} class]);
运行结果
Block[2068:75757] __NSGlobalBlock__ __NSMallocBlock__ __NSStackBlock__
void (^block)(void) = ^{
NSLog(@"Hello");
};
NSLog(@"%@", [block class]);
NSLog(@"%@", [[block class] superclass]);
NSLog(@"%@", [[[block class] superclass] superclass]);
运行结果
Block[2045:73636] __NSGlobalBlock__
Block[2045:73636] NSBlock
Block[2045:73636] NSObject
block的类型怎么区分呢?
每一种类型的block调用copy后的结果
在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上,比如以下情况
·block作为函数返回值时
·将block赋值给__strong指针时
·block作为Cocoa API中方法名含有usingBlock的方法参数时
·block作为GCD API的方法参数时