block访问外部变量
2015-12-29 12:01
369 查看
栈区 0x7fff5fbff7bc
堆区 0x100600180 (如何判断? 一般后6位 有内容, 不是零 -- 如果是静态区或者常量区的话 后4位有内容, 前面都是零 一般)
block内部不允许修改外部变量值
如果需要修改外部变量值, 得加上修饰符 __block int m = 10;
堆区 0x100600180 (如何判断? 一般后6位 有内容, 不是零 -- 如果是静态区或者常量区的话 后4位有内容, 前面都是零 一般)
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { int m = 10; NSLog(@"out m addr = %p",&m); // 栈区 //当定义block的时候,block会把外部变量以const的方式复制一份 //存放到block的所在的内存中... void (^myBlock)() = ^(){ NSLog(@"addr = %p",&m); // 堆区 NSLog(@"in block m = %d",m); }; myBlock(); }; return 0; }
block内部不允许修改外部变量值
如果需要修改外部变量值, 得加上修饰符 __block int m = 10;
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { __block int m = 10; NSLog(@"out m addr = %p",&m); // 栈区 //存放到block的所在的内存中... void (^myBlock)() = ^(){ m = 100; // 加上 __block 还是会拷贝(但不是const方式, 所以能修改...), 地址不一样. NSLog(@"addr = %p",&m); // 堆区 NSLog(@"in block m = %d",m); }; myBlock(); }; return 0; }
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { __block int m = 10; NSLog(@"out m addr = %p",&m); // 栈区 //存放到block的所在的内存中... void (^myBlock)() = ^(){ m = 100; // 加上 __block 还是会拷贝(但不是const方式, 所以能修改...), 地址不一样. NSLog(@"addr = %p",&m); // 堆区 NSLog(@"in block m = %d",m); }; myBlock(); NSLog(@"in block m = %d",m); NSLog(@"out m addr = %p",&m); }; return 0; } /** block[37442:1575659] out m addr = 0x7fff5fbff808 block[37442:1575659] addr = 0x100204a88 block[37442:1575659] in block m = 100 block[37442:1575659] in block m = 100 block[37442:1575659] out m addr = 0x100204a88 // m 的地址变成 block里的m的地址了. */
相关文章推荐
- http://blog.csdn.net/techbirds_bao/article/details/9233599
- mysql limit 用法
- jsp中div遍历list集合
- Ubuntu Intel+NVIDIA双显卡解决方案
- Huffman编码 java版
- 单独获取ShopEx商品类型中的扩展参数,如配货时间
- Android开发的环境搭建及HelloWorld的实现
- 关于 underscore 中模板引擎的应用示例
- 解决WIN7远程登录提示无法保存凭据的问题
- JS实例操作QQ空间自动点赞方法
- 使用oauth2.0自动获取用户信息
- windows2003+iis6.0+php(fastcgi)5.3+wincache+memcached
- Js实现类似PHP中的in_array方法
- Git 在推送(Push)信息的时候提示git did not exit cleanly (exit code 1)的解决办法
- JS判断当前使用的是哪个浏览器及其版本
- BytesWritable 存储问题
- VS2010 c/c++ 本地化 emscripten 配置
- nginx
- Linux中终止某个用户的所有进程的简单方法
- Android图形系统-架构