block内部实现原理(二)

block内部实现原理(一)

 

【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作为成员变量时,它也可以访问同一个对象里的其它成员变量。

 

 

未完待续

posted @ 2015-11-10 17:42  折半  阅读(536)  评论(0编辑  收藏  举报