美文网首页Objective - C 底层
Objective - C block(四)block内存管理及

Objective - C block(四)block内存管理及

作者: 爱玩游戏的iOS菜鸟 | 来源:发表于2020-05-11 12:28 被阅读0次

    block的内存管理

    (1)block copy操作
    1. 当block在栈上时,并不会对__block变量产生强引用

    2. 当block被copy到堆时,会调用block内部的copy函数

    • copy函数内部会调用_Block_object_assign函数
    • _Block_object_assign函数会对__block变量形成强引用(retain)
      image.png
    (2)block dispose操作

    当block从堆中移除时,会调用block内部的dispose函数

    • dispose函数内部会调用_Block_object_dispose函数
    • _Block_object_dispose函数会自动释放引用的__block变量(release)


      image.png
    (3)__block变量 和 对象类型 在block内部有什么区别?
    image.png

    区别:在mallocBlock内部,会直接对对象类型根据修饰符决定是强引用还是弱引用,而对__block修饰的变量会连同block一起拷贝到堆上,并指向该变量形成强引用,如果有其他的block对该变量引用,则不再拷贝,而是增加引用计数

    1. 当block在栈上时,对它们都不会产生强引用

    2. 当block拷贝到堆上时,都会通过copy函数来处理它们

    ① __block变量(假设变量名叫做a)

    • _Block_object_assign((void*)&dst->a, (void*)src->a, 8/*BLOCK_FIELD_IS_BYREF*/);

    ② 对象类型的auto变量(假设变量名叫做p)

    • _Block_object_assign((void*)&dst->p, (void*)src->p, 3/*BLOCK_FIELD_IS_OBJECT*/);
    1. 当block从堆上移除时,都会通过dispose函数来释放它们
      ① __block变量(假设变量名叫做a)
    • _Block_object_dispose((void*)src->a, 8/*BLOCK_FIELD_IS_BYREF*/);

    ② 对象类型的auto变量(假设变量名叫做p)
    _Block_object_dispose((void)src->p, 3/BLOCK_FIELD_IS_OBJECT*/);

    (4)被__block修饰的对象类型在block内部
    被__block修饰的对象类型在block内部 block中强引用结构体 在结构体中会根据是否修饰__weak决定强引用/弱引用原person对象 这一步几乎没有什么区别 这里自身地址+40 即为person对象 在assign函数内部会根据强/弱引用来决定是否retain(ARC环境下)

    block的循环引用

    记录学习内容近期停止

    相关文章

      网友评论

        本文标题:Objective - C block(四)block内存管理及

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