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
原创粉丝点击