美文网首页
OC中的Block(四)

OC中的Block(四)

作者: aaayia | 来源:发表于2018-11-27 14:32 被阅读9次

__block修饰符的内存管理

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

  2. 当__block修饰指针变量时,会在成的__Block_byref_xxx_0结构体中生成
    从copy函数和dispose函数:

void (*__Block_byref_id_object_copy)(void*, void*);
void (*__Block_byref_id_object_dispose)(void*);

当block被copy到堆时

  • 会调用block内部的copy函数
  • copy函数内部会调用_Block_object_assign函数
  • _Block_object_assign函数会对__block变量形成强引用(retain)
15432991962845.jpg
15432992034437.jpg

当block从堆中移除时

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

示例代码:

__block int lisi_age = 18;
block b = ^{
        NSLog(...);
    };
    b();

生成的__main_block_impl_0结构体

struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  
  __Block_byref_lisi_age_1 *lisi_age; // by ref
}

生成的__main_block_desc_0结构体

static struct __main_block_desc_0 {
  size_t reserved;
  size_t Block_size;
  void (*copy)(struct __main_block_impl_0*, struct __main_block_impl_0*);
  void (*dispose)(struct __main_block_impl_0*);
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0), __main_block_copy_0, __main_block_dispose_0};

__block修饰的指针类型变量生成的__Block_byref_lisi_age_1结构体

struct __Block_byref_lisi_age_1 {
  void *__isa;
__Block_byref_lisi_age_1 *__forwarding;
 int __flags;
 int __size;
 int lisi_age;
};
__Block_byref_lisi_age_1 lisi_age = {
    (void*)0,
    (__Block_byref_lisi_age_1 *)&lisi_age,
    0,
    sizeof(__Block_byref_lisi_age_1),
    18  
    };

__block的__forwarding指针

15432998612018.jpg 15432998651329.jpg

相关文章

  • swift 调用 OC中的block

    OC中声明block; OC中实现block swift中实现

  • iOS原生&JS交互

    OC 获取js中的key OC调用js方法 JS调用OC中不带参数的block JS调用OC中带参数的block ...

  • Swift之闭包

    前言 闭包类似于OC的block,但是比OC的block应用面更广 在OC中block是匿名函数 在swift中函...

  • OC中的Block(四)

    __block修饰符的内存管理 当block在栈上时,并不会对__block变量产生强引用 当__block修饰指...

  • Swift 之闭包

    闭包 闭包类似于 OC 的 block,但是比 OC 的 block 应用面更广 在 OC 中 block 是匿名...

  • iOS Block本质笔记

    OC中定义block block访问外部参数 OC转C++分析 block的变量捕获机制 为了保证block能够正...

  • OC中block底层原理总结(下)

    关于OC中block的本质结构、block的变量捕获方式请查看OC中block底层原理总结(上)需要先看懂上篇文章...

  • swift 闭包(类似OC中block)

    swift中的闭包 类似OC中block OC中block 回顾创建个HttpTool类.h .m 控制器中 sw...

  • 深入 Block

    Block 前言 Block是OC中对C语言的扩展功能,是一种带有自动变量的匿名函数,Block在OC中的实现,点...

  • swift基础语法(十三)——闭包

    介绍 闭包和OC中的block非常相似OC中的block是匿名的函数Swift中的闭包是一个特殊的函数block和...

网友评论

      本文标题:OC中的Block(四)

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