Block - 2
来源:互联网 发布:java play 编辑:程序博客网 时间:2024/05/16 07:32
上一篇文章我们大概了解了block的定义,并且知道了其定义和使用的形式。
这一篇文章主要是总结一些block最常见的问题:
变量作用域的问题 - __block 只读block外域变量
#pragma mark - 变量的作用域 (与变量的关系)
int x = 123; void (^printXAndY)(int) = ^(int y){ printf("%d %d\n", x, y); //print的没有问题,只是读,那么修改呢? }; printXAndY(456);
修改block外域变量:
编译不给通过,并且明确给定错误,变量不可以直接赋值,缺失了__block限定词。
这个解决不难直接地加上一个__block,Done:
__block int z = 123; void(^changeTestZAndPrintK)(int) = ^(int k){ z = 124; printf("%d \n", k); }; changeTestZAndPrintK(1);
那原理呢? 哈哈 就一头雾水了吧?看这位大神吧:http://blog.csdn.net/smking/article/details/8424902
其实block外非__block声明变量 除了static extern变量等默认为auto变量,即自由变量,自由变量在block内是被拷贝一份并且置const限定的。所以无法修改。
再看一个例子:
可以看到修改autoValue在前,输出值在后,但是值仍然不变。
最后一个问题便是循环引用的问题,原理和解决都是非常简单,就不多说了,直接上例子和解决方法。
原理就是两者强引用导致双方无法释放,解决方法就是添加非block成员为__weak变量,__weak属性指向但不强引用(弱引用)。
0 0
- Block 2: Block语法
- block(2)
- Block ------- 2
- Block - 2
- Block笔记(2):Block变量
- Block系列2:Block内存管理
- IOS block编程指南 2 block开始
- block 语法详解2
- iOS Block详解2
- block(2)
- Block in iOS (2)
- 浅谈block(2)
- Objective-C Block(2)
- Block
- block
- Block
- block
- block
- C语言中函数参数入栈的顺序
- <学习笔记>Could not load the Tomcat server configuration
- jQuery过滤选择器
- 数塔(dp)
- mint安装oracle
- Block - 2
- SAE php读取MySQL
- <学习笔记>查看Tomcat的版本
- 2016各大公司智力题和找规律题
- HTTP协议详解
- springmvc常用注解之@Controller和@RequestMapping
- <学习笔记>jar包置放在WEB-INF/lib下和通过build path导入的区别是什么
- 读《梁启超论人生》
- 不工具下的驱动 driver