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
- OC __block int i 和 int i的区别
- for(int i = 0; i < 10; i++) 与 for(int i = 0; i < 10; ++i) 的区别
- 由int i和int i=new int()想到的
- int i=010 与int i=10 区别:
- for(int i=0;i<list.size();i++) 与 for(int i=0,len=list.size();i<len;i++)的区别
- Int(i)的结果不正确
- Register int i;的含义
- Register int i;的含义
- for(int i = 0;i < 10;i++)和int i;for(i = 0;i < 10;i++)
- (int*) 和 (int&)的区别
- (int&)和(int)的区别
- parseInt(String s)与valueOf(int i) 的区别
- parseInt(String s)与valueOf(int i) 的区别
- parseInt(String s)与valueOf(int i) 的区别
- int i和int i = new int()有什么不同?
- int int& int * int**的区别、联系和用途
- int int& int * int**的区别、联系和用途
- integer.tostring(int i) 和Sting.valueof(int)
- Android内存泄露的情况
- leetCode||two sum
- 下颌角肥大,缺点变焦点,美丽赢得未来
- OnEditorActionListener
- 最大值最小值问题
- OC __block int i 和 int i的区别
- HQL: Hibernate查询语言
- NSURLConnection和NSMutableURLRequest 实现同步、异步请求 和 NSInputStream和NSMutableURLRequest-实现保存文件到服务器
- Android---Matrix类的使用,图像的处理
- nachos操作系统学习(1)在windows下向eclipse导入nachos源代码
- 字节序
- 论代码规范
- 指针
- 数据库的.dat文件导入MySQL