block 对外部引用变量的处理
2015-12-14 14:34
225 查看
block 对外部引用变量的处理
MRC 环境一、静态变量 和 全局变量 在加和不加 __block 都会直接引用变量地址。也就意味着 可以修改变量的值。在没有加__block 参数的情况下。
全局block 和 栈block 区别为 是否引用了外部变量,堆block 则是对栈block copy 得来。对全局block copy 不会有任何作用,返回的依然是全局block。二, 常量变量(NSString *a = @"hello";a 为常量变量,@“hello”为常量。)-----不加__block类型 block 会引用常量的地址(浅拷贝)。加__block类型 block会去引用常量变量(如:a变量,a = @"abc".可以任意修改a 指向的内容。)的地址。
如果不加__block 直接在block 内部修改变量 ,会编译报错。block 内部改变量是 只读的。但是 就一定可以推断 block 会深拷贝 该变量吗???
对于常量 @“hello” 存储在 内存中的常量区, 程序结束才会释放 内存。 如:
NSString *str = @"hello";
NSString *abcStr = @"hello";
编译器会优化处理, str 和 abcStr 都会指向 常量区的@“hello” 地址。
NSString *str = @"hello"; void (^print)(void) = ^{ NSLog(@"block=str======%p",str); } str = @"hello1"; print();
block 会拷贝变量内容到自己的栈内存上,以便执行时可以调用。 但并不是对str 内容做了深拷贝,重新申请内存。
因为str 是栈内存上的变量,指向 一个常量区的@“hello”. 编译器做的优化是 当block 去拷贝str 指向内容时发现是个常量,
所以会去引用 @“hello” 的指针,没必要再取申请一块内存。
转至于
/article/4888919.html
相关文章推荐
- 过来人的Java编程经验汇总3-整理&重制
- 《game design workshop》阅读笔记(二)——Game Design Basics——The Structure of Games
- PHP清除网页病毒的方法
- SGU 310. Hippopotamus( 状压dp )
- 通过ajax方式实现用户名存在性检查
- Android目录结构简介
- Mysql 别名的使用方法
- IOS NSString比较,截取,NSLog,NSRang,isEqualToString,stringWithFormat
- 过来人的Java编程经验汇总2-整理&重制
- Android应用开发自定义图片剪辑头像设置
- Google推出Apache加速模块 速度提高50%!
- css3的nth-child和:nth-of-type之间的差异
- CSS书写顺序
- Android View和ViewGroup的关系
- WordPress导航菜单的滚动和淡入淡出效果的实现要点
- iOS8以上UITableViewCell的分割线偏移处理
- 找不到类ImmutableSettings
- 可移动的悬浮窗
- PhotoShop CS6破解方法及文件下载
- 两段简单的JS代码防止SQL注入