Block本质

Block本质

  • block本质上也是一个OC对象,它内部也有个isa指针,在__block_impl结构体中;

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

  • block的底层结构如下:

//block的底层实现就是__main_block_impl_0结构体
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
 __Block_byref_age_0 *age; // by ref
};
struct __block_impl {
  void *isa;//OC对象标志性指针
  int Flags;
  int Reserved;
  void *FuncPtr;//block执行的代码地址
};
static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
//下面两个捕获非Object对象不会生成,用来内存管理
void (*copy)(struct __main_block_impl_0*, struct __main_block_impl_0*);//实现强弱引用
void (*dispose)(struct __main_block_impl_0*);//release操作
};
struct __Block_byref_age_0 {
  void *__isa;
__Block_byref_age_0 *__forwarding;
 int __flags;
 int __size;
 int age;
};

Block的变量捕获

变量捕获

Block类型

1.block有3种类型,可以通过调用class方法或者isa指针查看具体类型,最终都是继承自NSBlock类型

  • NSGlobalBlock ( _NSConcreteGlobalBlock )
  • NSStackBlock ( _NSConcreteStackBlock )
  • NSMallocBlock ( _NSConcreteMallocBlock )
    2.block类型转换
    block捕获变量.png
  • block调用copy


    block调用copy
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容