OC之 block 本质

实现方式

数据结构定义

block 的数据结构定义如下(图片来自 这里):

07184527_zRQx.jpg

对应的结构体定义如下:


struct Block_descriptor {  
unsigned long int reserved;
unsigned long int size;
void (*copy)(void *dst, void *src);
void (*dispose)(void *);
};

struct Block_layout {   
 void *isa;   
 int flags;   
 int reserved;    
 void (*invoke)(void *, ...);  
 
struct Block_descriptor *descriptor;    
   
/* Imported variables. */};


  1. isa 指针,所有对象都有该指针,用于实现对象相关的功能。

  2. flags,用于按 bit 位表示一些 block 的附加信息,本文后面介绍 block copy 的实现代码可以看到对该变量的使用。

  3. reserved,保留变量。

  4. invoke,函数指针,指向具体的 block 实现的函数调用地址。

  5. descriptor, 表示该 block 的附加描述信息,主要是 size 大小,以及 copy 和 dispose 函数的指针。

  6. variables,capture 过来的变量,block 能够访问它外部的局部变量,就是因为将这些变量(或变量的地址)复制到了结构体中。

该数据结构和后面的 clang 分析出来的结构实际是一样的,不过仅是结构体的嵌套方式不一样。但这一点我一开始没有想明白,所以也给大家解释一下,如下 2 个结构体 SampleA 和 SampleB 在内存上是完全一样的,原因是结构体本身并不带有任何额外的附加信息。


struct SampleA { 
   int a;   
   int b;   
   int c;
  };
  
struct SampleB {    
 int a; 
  
 struct Part1 {      
 int b;   
 }; 
   
 struct Part2 {    
 int c;   
     };
  };

在 Objective-C 语言中,一共有 3 种类型的 block:

  1. _NSConcreteGlobalBlock 全局的静态 block,不会访问任何外部变量。

  2. _NSConcreteStackBlock 保存在栈中的 block,当函数返回时会被销毁。

  3. _NSConcreteMallocBlock 保存在堆中的 block,当引用计数为 0 时会被销毁。



转载于:https://my.oschina.net/shaw1688/blog/599082

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值