美文网首页
block实质

block实质

作者: 高思阳 | 来源:发表于2018-10-22 15:25 被阅读0次
block定义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. */
};

实际上block就是这俩玩意了

我们来举个栗子看看


定义一个最简单block 打印hello world

使用clang指令
clang -rewrite-objc main.m
得到一个cpp文件
打开之,你就会看到什么是block了


cpp文件

你定义完block之后,其实是创建了一个函数,在创建结构体的时候把函数的指针一起传给了block,所以之后可以拿出来调用。

再看看值捕获的问题


未加__block前缀
未加__block前缀

定义block的时候,变量a的值就传递到了block结构体中,仅仅是值传递,所以在block中修改a是不会影响到外面的a变量的。


加了__block前缀
加了__block前缀

并不是直接传递a的值了,而是把a的地址传过去了,所以在block内部便可以修改到外面的变量了。

根据isa指针,block一共有3种类型的block
_NSConcreteGlobalBlock 全局静态
_NSConcreteStackBlock 保存在栈中,出函数作用域就销毁
_NSConcreteMallocBlock 保存在堆中,retainCount == 0销毁
而ARC和MRC中,还略有不同

链接:https://www.zhihu.com/question/30779258/answer/49492783

相关文章

  • 《OC高级编程》之 Blocks(二)

    Block 的实现 Block 的实质     Block 实质上是 Object-C 对象     所谓截获自动...

  • Block实质

    PersonalBlog首发: http://lanjiying.allenqin.com/2018/04/11/...

  • block实质

    实际上block就是这俩玩意了 我们来举个栗子看看 使用clang指令clang -rewrite-objc ma...

  • block实质

    block实质是:封装了函数及其执行上下文的对象 block调用的本质是:函数的调用

  • block概念

    block的实质: block实质是oc对闭包的对象实现,简单点来说 block就算是对象。 block的书写方式...

  • 2019年年初iOS招人心得笔记 答案 (三)

    中级Block 1、block的实质是什么?一共有几种block?都是什么情况下生成的? block的实质是什么?...

  • 2019 iOS 面试 -中级篇之 Block

    1. block的实质是什么?一共有几种block?都是什么情况下生成的? block的实质是什么? block本...

  • Block探究

    block的实质是什么?一共有几种block?都是什么情况下生成的? block的实质是什么? block本质上也...

  • block的实质

    1.什么是block block是将函数及其执行上下文封装起来的对象,是一段代码块,是一个结构体,里面有isa指针...

  • iOS Block实质

    实质 block 实质是一个OC对象,也存在 isa 指针 1.底层实现 先看一个最简单的block例子: 使用 ...

网友评论

      本文标题:block实质

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