Block简介Block其实包含两个部分内容Block执行的代码,这是在编译的时候已经生成好的;一个包含Block执行时需要的所有外部变量值的数据结构。 Block将使用到的、作用域附近到的变量的值建立一份快照拷贝到栈上。Block与函数另一个不同是,Block类似ObjC的对象 ...
Block简介
Block其实包含两个部分内容
- Block执行的代码,这是在编译的时候已经生成好的;
- 一个包含
Block执行时需要的所有外部变量值
的数据结构。 Block将使用到的、作用域附近到的变量的值
建立一份快照拷贝到栈上。 - Block与函数另一个不同是,Block类似ObjC的对象,可以使用自动释放池管理内存
Block在内存中的位置
根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock。
- NSGlobalBlock:类似函数,位于text段;
- NSStackBlock:位于栈内存,函数返回后Block将无效;
- NSMallocBlock:位于堆内存。
Block被另一个Block使用时,另一个Block被copy到堆上时,被使用的Block也会被copy。但作为参数的Block是不会发生copy的。
Block对不同类型的变量的存取
基本类型
适用于MRC和ARC的情况
- 局部自动变量,在Block中只读。Block定义时copy变量的值,在Block中作为常量使用,所以即使变量的值在Block外改变,也不影响他在Block中的值。
- static变量、全局变量。Block就可以对它们进行读写了。因为全局变量或静态变量在内存中的地址是固定的,Block在读取该变量值的时候是直接从其所在内存读出,获取到的是最新值,而不是在定义时copy的常量。
- Block变量,被
__block
修饰的变量称作Block变量。 基本类型的Block变量等效于全局变量、或静态变量。
ObjC对象
不同于基本类型,Block会引起对象的引用计数变化。
MRC:
- 局部自动变量,在Block copy时,系统自动retain对象,增加其引用计数。
- static变量,全局变量,在内存中的位置是确定的,所以Block copy时不会retain对象。
- Block变量,在Block copy时也不会retain。
- 实例变量,在Block copy时也没有直接retain 实例变量对象本身,但会retain 实例变量的拥有者self。所以在Block中可以直接读写 实例变量。
ARC:
- 只有在使用local变量时,block会复制指针,且强引用指针指向的对象一次。其它如全局变量、static变量、block变量等,block不会拷贝指针,只会强引用指针指向的对象一次。
- 标记了为__weak或__unsafe_unretained的local变量。block仍会强引用指针对象一次。
参考:http://my.oschina.net/u/1432769/blog/390401?fromerr=QO9ABGMC
http://tanqisen.github.io/blog/2013/04/19/gcd-block-cycle-retain/
原标题:Block使用要点
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。