从底层上讲block变量: 指向结构体的一个指针
// block变量:
//1.MRC下当声明的block实现部分, 没有引入外界的任何局部变量,或者引入全局变量或者static变量那么该block位于全局静态区, 此时block的内存不需要程序员管理, 程序运行结束时, 内存被系统回收
//2.当block引入局部变量, 此时block位于栈区, 出了函数作用域, 该内存就被释放掉, 执行回调的时候, 使用栈区的block很危险, 容易造成野指针问题, 为什么block要使用copy的原因
//3.对栈区的block进行copy操作, 此时block的内存就会有栈区迁移到堆区, 我们对于全局静态区的block进行copy, 此时还位于全局静态区
// *当我们局部变量前面加上static和__block或者全局变量, 他们在传入结构体的时候, 相当于传入了一个变量的指针, 所以当我们在调用之前改变a的值的时候, 结果会发生变化
// *当栈区的block引用的是对象类型的局部变量, 当进行copy, 内存迁移到堆区的时候, 会对所引用的对象类型进行引用计数+1
__block int a = 20;
// block迁移的时候, 告诉系统不要对所引入的对象类型进行引用计数+1
__block Person *p1 = [[Person alloc] init];
p1.age = 551;
void(^myBlock)() = ^{
NSLog(@" a = %d, p1.age = %ld", a, p1.age);;
};
// NSLog(@"%@", Block_copy(myBlock));
myBlock = [myBlock copy];
a = 30;
p1.age = 43;
myBlock();
NSLog(@"person.retain.count = %ld", [p1 retainCount]);
[p1 release];
// ! (MRC) 堆区的block内存需要进行释放
// Block_release(myBlock);