iOS Block

Block介绍

iOS中的block类似于C++的成员函数指针,也类似于JS中的lambada函数,本质上就是一个OC的对象,继承自NSBlock,用于存储函数的上下文以及调用环境。

Block分为三种类型

全局NSConreateGlobalBlock

    不访问外部变量的block

栈Block NSConcreateStackBlock

    访问外部变量但未进行copy的block为栈block

堆Block NSConcreateMallocBlock

    block内的数据修改的时候,需要进行__block修饰的block或者访问外部变量进行copy的block

Block三种修饰符的作用

__block

    block默认局部变量是不能进行修改操作的,是只读的这,想要进行修改就需要通过__block去修饰,block体的局部变量默认是值拷贝,跟外部的局部变量内存地址不一样,所以为什么block内的布局变量是可以读的但不能写,通过__block将局部变量生成一个block结构体,将结构体中的forwarding指针指向block体内的对象,从而进行对象的操作。

__weak

    常用于解决self强引用block,block强引用self导致循环引用问题,通过__weak对self进行弱引用,从而达到解决循环引用的问题。

__strong

    提高安全性,防止被其他线程提前释放。


Block的copy操作

    堆block

    引用计数器会加1

    栈block

    从栈内存拷贝到堆内存

    全局block

    什么也不做

    


    

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容