Block本质(block类型)

Block的类型

block有三种类型,可以通过调用class方法或者isa指针查看具体类型,最终都是集成自NSBlock类型
·NSGlobalBlock(_NSConcreteGlobalBlock)
·NSStackBlock(_NSConcreteStackBlock)
·NSMallocBlock(_NSConcreteMallocBlock)

block在内存中位置.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]);

运行结果
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类型.png

每一种类型的block调用copy后的结果


block被copy后.png

在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上,比如以下情况
·block作为函数返回值时
·将block赋值给__strong指针时
·block作为Cocoa API中方法名含有usingBlock的方法参数时
·block作为GCD API的方法参数时

你可能感兴趣的:(Block本质(block类型))