写点什么

Block 的分类

作者:NewBoy
  • 2022 年 7 月 17 日
  • 本文字数:623 字

    阅读完需:约 2 分钟

Block 的分类

  • NSConcreteGlobalBlock 全局的静态 block,不会访问任何外部变量。

  • NSConcreteStackBlock 保存在栈中的 block,当函数返回时会被销毁。

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

NSConcreteGlobalBlock 类型的 block 的实现

void (^testGlobalBlock)() = ^{    NSLog(@"hello block");};int main(int argc, const char * argv[]) {    testGlobalBlock();    return 0;}
复制代码


testGlobalBlock 的isa指向了_NSConcreteGlobalBlock,即在全局区域创建,block变量存储在全局数据存储区

NSConcreteStackBlock 类型的 block 的实现

int main(int argc, const char * argv[]) {    void (^testStackBlock)() = ^{        NSLog(@"hello block");    };    testStackBlock();    return 0;}
复制代码


testStackBlock 的isa指向了_NSConcreteStackBlock,即在栈区创建。

NSConcreteMallocBlock 类型的 block 的实现

int main(int argc, const char * argv[]) {   void (^testStackBlock)() = [^{        NSLog(@"hello block");    } copy];    testStackBlock();    return 0;}
复制代码


NSConcreteMallocBlock 类型的 block 通常不会在源码中直接出现,其需要由_NSConcreteStackBlock类型的block拷贝而来(也就是说block需要执行copy之后才能存放到堆中)。


其内部通过函数 memmove 将栈中的block的内容拷贝到了堆中,并使isa指向了_NSConcreteMallocBlock


block主要的一些学问就出在栈中block向堆中block的转移过程中了。

发布于: 刚刚阅读数: 5
用户头像

NewBoy

关注

虽不年少,艳阳高照 2019.04.10 加入

还未添加个人简介

评论

发布
暂无评论
Block 的分类_ios_NewBoy_InfoQ写作社区