【block 在MRC下实现】
首先定义了三个方法
分别看下输出的值有什么不同,毫无疑问
分别来看下在-rewrite-objc选项编译下m值的变化:
1. test1
2. test2
3. test3
注意标红线部分,test1,是直接传递的m的值,而test2,test3 则传递的是&m 也就是m的函数地址。
test1中比之前的简单block,可以看出这次的block结构体__main_block_impl_0多了个成员变量m,用来存储使用到的局部变量m(值为10);并且此时可以看到__cself参数的作用,类似C++中的this和Objective-C的self
test2使用了__block类型标识符,test2相比test1、test3,多了__test2_block_copy_0、__test2_block_dispose_0 方法
所以由于block也是NSObject,我们可以对其进行retain操作。不过在将block作为回调函数传递给底层框架时,底层框架需要对其copy一份。比方说,如果将回调block作为属性,不能用retain,而要用copy。我们通常会将block写在栈中,而需要回调时,往往回调block已经不在栈中了,使用copy属性可以将block放到堆中。或者使用Block_copy()和Block_release()。
test3使用了static标识符,上面中间代码片段与test1的差别主要在于main函数里传递的是m的地址(&m),以及__main_block_impl_0结构体中成员i变成指针类型(int *)。
然后在执行block时,通过指针修改值。
当然,全局变量、静态全局变量都可以在block执行体内被修改。更准确地讲,block可以修改它被调用(这里是__main_block_func_0)时所处作用域内的变量。比如一个block作为成员变量时,它也可以访问同一个对象里的其它成员变量。
未完待续