// MRC 环境下:
// 1 NSGlobalBlock, 静态区
/*
// 没有引入任何局部变量|全局变量 | static 变量
// block 位于全局静态区, 不需要我们管理, 程序运行完,系统回收
// a 为静态变量, 存于全局静态区, block 函数内部没有引入任何局部变量(包括对象)
static int a = 20;
// 相当于函数声明
void(^myBlock)() = ^{
NSLog(@"hello, a = %d",a);
};
NSLog(@"%@",myBlock); // 打印: block[796:61901] <__NSGlobalBlock__: 0x100004260>
a = 30;
// 函数调用
myBlock();// hello, a = 30
// *在全局静态区的 block 执行 copy, 仍在全局静态区, 在函数调用前对变量进行修改,结果也会变. block 底层说:执行结构体的指针.
// *局部变量前面加上 static, __block, 全局变量; 他们传入结构体相当于传了指针. 在调用之前改变 a 的值,结果会变化.
*/
// 2 NSStackBlock, 栈区
/*
// 局部变量
int a = 20;
void(^myBlock)() = ^{
NSLog(@"hello, a = %d",a);
};
// block 位于栈区, 出了函数作用域,给内存就被释放掉了, 只执行回调的时候,栈区的 block 很危险, 容易造成指针问题,*** 为什么 block 使用 copy 额原因
NSLog(@"%@",myBlock); // <__NSStackBlock__: 0x7fff5fbff7a8>
// 此时 block 中传入的局部变量, 相当于直接将常量20放入 block 函数实现体, 所以改变 a 的值,不会对 block 内部产生改变.
a = 30;
myBlock(); // hello, a = 20
*/
// 3. NSMallocBlock, 堆区
// 此时 block 由栈区迁徙到堆区.
// 但如果对全局静态区的 block 进行 copy, 还在全局静态区
int a = 20;
void(^myBlock)() = ^{
NSLog(@"hello, a = %d",a);
};
NSLog(@"%@",[myBlock copy]); // <__NSMallocBlock__: 0x100206b40>
a = 30;
// block 赋值时, 局部变量相当于常量20, 结果不会随变量发生改变.
myBlock();// hello, a = 20
}
return 0;
}
block存储位置问题
最新推荐文章于 2020-07-25 21:35:10 发布