OC __block int i 和 int i的区别

来源:互联网 发布:刺客信条起源ps4优化 编辑:程序博客网 时间:2024/05/27 00:45

------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类型数据的地址.

         


0 0
原创粉丝点击