------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
__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类型数据的地址.