OC中的block

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC中的block相关的知识,希望对你有一定的参考价值。

参考技术A

我们都知道block在oc中是很常用的,随处可见,越来越多的原先delegate的实现现在都用block去处理了,可见block的重要性。
那么什么是block呢?block在使用的时候要注意什么呢?
直接show code,看看底层block到底是变成了啥数据结果的

So,NSGlobalBlock、NSStackBlock、NSMallocBlock这3种又有啥区别呢

在MRC下:
NSGlobalBlock:没有访问(捕获)auto变量(局部变量)的block (数据区)
NSStackBlock:访问(捕获)auto变量(局部变量)的block (栈区)
NSMallocBlock: 对NSStackBlock做了一次copy操作后得到的block。(堆区)

在ARC下:
被强指针引用的block且引用了外部变量,那么会自动做一次copy操作,即把NSStackBlock上的block copy到NSMallocBlock上。即被strong,copy修饰的block且用了外部变量就是NSMallocBlock。

判断捕获对象释放:
NSStackBlock(栈上的block)会对捕获对象进行强引用。(在arc模式下,block作为函数的参数传递,此时的block是NSStackBlock)
NSMallocBlock(堆上的block)会对捕获的对象进行引用,捕获的对象也会被copy到堆空间上。(如果捕获的对象是strong类型的,就会强引用,如果是__weak 修饰的weak类型,就会弱引用)。

block访问外部变量有几种方式呢?

那么__block 做了啥呢?
__block 修饰后,底层会把捕获的局部变量包装成一个对象,通过捕获这个变量来修改局部变量的值。

总结来说,如果是__block修饰的变量,在block内部被修改了,这个过程中存在了3层copy操作:

Swift 闭包 与 OC block区别

参考技术A 点击button输出全部为4,这和OC不一样。在OC Block中对局部自动变量的捕获方式默认为值捕获,而在swift中默认为指针捕获。若要将闭包捕获方式改为值捕获,参考如下:

输出结果为0,1,2,3,4。

以上是关于OC中的block的主要内容,如果未能解决你的问题,请参考以下文章

关于OC中的block自己的一些理解

OC之block解析

swift学习第十五天:闭包

swift中的block

ios 中的block应用

iOS开发中OC和swift的对比