A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiniuniu 中级黑马   /  2015-4-17 17:03  /  963 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

__block声明的变量和不用__block声明的变量有什么区别呢? 示例代码如下:


  1. #import <Foundation/Foundation.h>

  2. int main()
  3. {
  4.     __block int i = 0;
  5.     __block int j = 0;
  6.     __block int k = 0;
  7.    
  8.     int x = 0x44444444;
  9.     int y = 0x55555555;
  10.     int z = 0x66666666;
  11.    
  12.     void (^myblock)() =
  13.     ^()
  14.     {
  15.         i = 0x11111111;
  16.         j = 0x22222222;
  17.         k = 0x33333333;
  18.     };
  19.    
  20.     myblock();
  21.    
  22.     NSLog(@"%i", x);
  23.     NSLog(@"%i", y);
  24.     NSLog(@"%i", z);
  25.    
  26.     return 0;
  27. }
复制代码
调试运行, 走起




根据观察窗口可以看到块信息中分别包含了用 __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 个回复

您需要登录后才可以回帖 登录 | 加入黑马