__block声明的变量和不用__block声明的变量有什么区别呢? 示例代码如下:
- #import <Foundation/Foundation.h>
- int main()
- {
- __block int i = 0;
- __block int j = 0;
- __block int k = 0;
-
- int x = 0x44444444;
- int y = 0x55555555;
- int z = 0x66666666;
-
- void (^myblock)() =
- ^()
- {
- i = 0x11111111;
- j = 0x22222222;
- k = 0x33333333;
- };
-
- myblock();
-
- NSLog(@"%i", x);
- NSLog(@"%i", y);
- NSLog(@"%i", z);
-
- return 0;
- }
复制代码 调试运行, 走起
根据观察窗口可以看到块信息中分别包含了用 __block 声明的三个变量i, j, k的相关信息
分别展开i, j, k, 可以看到i, j, k 是类似OC对象的数据结构, 每个对象的第5个数据成员才是真正存放, i, j, k所赋值的地方
而 x, y, z则是分配到栈空间连续存储的三个int类型变量, 没有附加任何其它信息. 根据他们的地址, 可以看出__block声明的变量和x,y, z,三个局部变量存储在完全不同的内存空间 也就是存储在堆 上的.
而随之相应访问了__block 类型变量的块代码中,也分别存储了每个由__block对象变量的首地址. 因此也就可以在块代码中,对这些变量进行访问和修改 在块数据空间中, 可以找到 "i"对象的首地址: 0x0100300040, i 0x0100300040 + 0x18 = 0x0100300058 就可以得到所要操作变量"i"的真正地址 同理: j 0x0100300060 + 0x18 = 0x0100300078 k 0x0100300080 + 0x18 = 0x0100300098
结论: 通过__block声明定义的变量是一种存储在堆空间中的"对象" 块也是一个对象, 对象中存储了要访问的__block类型数据的地址.
|