美文网首页IOS开发知识点
OC-简单粗暴理解Block的本质

OC-简单粗暴理解Block的本质

作者: li_礼光 | 来源:发表于2018-08-24 17:04 被阅读221次

    block简单粗暴的理解

    • OC的block底层就是个OC对象,包含isa指针,封装了函数的调用.

    • OC的block的底层会捕获局部变量(auto(值传递) / static(指针传递)),简单粗暴来说就是在底层中生成一个捕获的变量. 全局的不会捕获.
      PS : 捕获的意思是,在runtime运行时创建一个新的指针.指向block中的调用的成员变量

    OC的block最终继承的类型是  : NSBlock类型,有三种类型(数据段,栈,堆)
    
    Block的类                  副本源的配置存储域      复制效果        环境
    __NSConcreteStackBlock     栈                   从栈复制到堆    访问了auto变量
    __NSConcreteGlobalBlock    程序的数据区域         什么都不做      没有访问auto变量
    __NSConcreteMallocBlock    堆                   引用计数增加    __NSConcreteStackBlock调用了copy
    
    • OC的block用copy修饰,为了将block存放到堆上,引用计数+1,不会自动销毁,方便管理.

    • OC的block在MRC的时候需要考虑以上的三种类型,和调用的配置存储域,但是在ARC的环境下,编译器会自动帮我们Copy和release.

    MRC的建议写法 : copy
    ARC的建议写法 : strong修饰和copy修饰都可以,偏向于copy,统一MRC的写法
    
    • 用weak修饰的变量,拿到block中去访问,引用计数不会增加,所以不会进行copy操作,不存在强引用.

    OC的block的 __block本质细节,在底层转生成一个__block_byref_xxx的指向结构体的指针.
    这个新生成的结构体会保存block中的值,当调用这个block的时候,又会从这个新生成的结构体中取值

    新的考虑点1 : 这里会是在runtime运行时的时候创建新的结构体对象,会对性能有一定的消耗.
    新的考虑点2 : 针对考虑点1,在block中注意使用的是成员变量还是使用对象指针调用.从而考虑到要不要用block去修饰.如果是使用成员变量去修改它的值,那么就需要用__block去修饰.如果用的是对象指针,调用方法的方式,那么就不需要使用__block修饰

    相关文章

      网友评论

        本文标题:OC-简单粗暴理解Block的本质

        本文链接:https://www.haomeiwen.com/subject/ocxiiftx.html