OC __block int i 和 int i的区别

------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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值