美文网首页
block的底层原理

block的底层原理

作者: 逗憨de憨 | 来源:发表于2019-01-14 17:58 被阅读0次

    一、block的本质

    . block本质上也是一个OC对象,它内部也有个isa指针

    . block是封装了函数调用以及函数调用环境的OC对象

    c++文件中的原型:

    二、blcok的捕获:

    三、blcok的分类:

    四、copy的作用

    五、对象类型的auto变量

    eg:

    六、block的修饰

    通过c++文件查看本质:

    _ _ block的本质窥探:

    七、_ _ block的内存管理 

    对于auto变量的内存管理: 

    1.当__block变量在栈上时,并不会对__block变量产生强引用

    2.当block被拷贝到堆时 ,copy函数内部会调用_Block_object_assign函数,_Block_object_assign函数会对__block变量形成强引用(retain)

    3.当block从堆中移除时,会调用block内部的dispose函数,dispose函数内部会调用_Block_object_dispose函数,_Block_object_dispose函数会自动释放引用的_block变量(release)

    对于对象类型变量的内存管理: 

    1.当__block变量在栈上时,不会对指向的对象产生强引用。

    2.当__block变量被copy到堆时,会调用__block变量内部的copy函数,copy函数内部会调用_Block_object_assign函数,_Block_object_assign函数会根据所指向对象的修饰符(__strong、__weak、__unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用(注意:这里仅限于ARC时会retain,MRC时不会retain

    3.当__block变量从堆中移除时,会调用__block变量内部的dispose函数,dispose函数内部会调用_Block_object_dispose函数,_Block_object_dispose函数会自动释放所指向的对象(release) 

    八、循环引用问题

    在ARC环境下,解决循环引用的问题:

    1.利用__weak、__unsafe_unretained解决。  

              __weak :使得block内部使用弱指针访问外面的变量

              写法一: __weak DMXPerson    *weakPerson = person;

              写法二:__weak typeof(person)  weakPerson = person;

             __weak、__unsafe_unretained两者之间的区别:

             __weak:不会产生强引用,指向的对象销毁时,会自动让指针置为nil

             __unsafe_unretained:不会产生强引用,不安全,指向的对象销毁时,指针存储的地址值不变

    2.利用__block解决(但是必须得调用block,block内部需要清空指针,打破循环,否则还是会导致循环引用,所以解决循环引用的问题首选第一种方式__weak)

    在MRC环境下,解决循环引用的问题:

    1.MRC环境下不支持__weak,故可以使用__unsafe_unretained解决。

    2.也可以使用__block来解决。

    在MRC环境下,不会对被修饰的对象进行retain操作。

    九.有关block的面试题:

    block的原理是怎样的?本质是什么?

    block本质上也是一个OC对象,它内部也有个isa指针。是封装了函数调用以及函数的调用环境的OC对象。

    __block的作用是什么?有什么使用注意点?

    通过__block的修饰,可以使auto变量包装成一个对象,可以解决block内部无法修改auto变量值的问题。

    使用注意点:在MRC环境下,不会对被修饰的对象进行retain操作

    block的属性修饰词为什么是copy?使用block有哪些使用注意事项?

    block一旦没有进行copy操作,就不会在堆上(可以控制它的生命周期),而是在栈上(系统控制其生命周期)。

    注意循环引用的问题

    block在修改NSMutableArray,需不需要添加__block?

    不需要

    相关文章

      网友评论

          本文标题:block的底层原理

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