__block修饰对象类型
那么如果变量本身就是对象类型呢?通过以下代码生成c++源码查看
int main(int argc, const char * argv[]) {
@autoreleasepool {
__block Person *person = [[Person alloc] init];
NSLog(@"%@",person);
Block block = ^{
person = [[Person alloc] init];
NSLog(@"%@",person);
};
block();
}
return 0;
}
通过源码查看,将对象包装在一个新的结构体中。结构体内部会有一个person
对象,不一样的地方是结构体内部添加了内存管理的两个函数__Block_byref_id_object_copy
和__Block_byref_id_object_dispose
__Block_byref_id_object_copy
和__Block_byref_id_object_dispose
函数的调用时机及作用在__block内存管理部分详细分析。