美文网首页iOS
block底层那些你不知道的事

block底层那些你不知道的事

作者: 水达 | 来源:发表于2019-02-18 23:56 被阅读0次

如果block只掌握了怎么去应用,那了解了block的皮毛。若想要精通block,非得了解block的本质不行!

block的实质

  1. block对象本质是一个结构体,里面主要信息有:isa指针指向自己的类(三类:global程序的数据区域、 malloc堆、 stack栈),desc结构体描述block的信息,__forwarding指向自己或堆上自己的地址。
  2. 如果block对象截获变量,这些变量也会出现在block结构体中。最重要的block结构体有一个函数指针,指向block代码块。
  3. block结构体的构造函数的参数,包括函数指针,描述block的结构体,自动截获的变量(全局变量不用截获)
  4. 引用到的__block变量。(__block对象也会转变成结构体)
  5. block代码块在编译的时候会生成一个函数,函数第一个参数是前面说到的block对象结构体指针。执行block,相当于执行block里面__forwarding里面的函数指针。

__block做了什么?

总论:__block 所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址拷贝堆中。

分步来看:

__block int m = 0;
struct __Block_byref_m_0 {
    void *__isa;
    __Block_byref_val_0 *forwarding;
    int __flags;
    int __size;
    int m;
};
__Block_byref_m_0 *m;

以上是__block加上之后引起的变化,把原来的变量封装到了结构体里面。
由于此时的变量m变成了一个结构体指针变量,所以,在block里面对指针的操作,会影响指针指向的值的。所以,最终可以改变外部的值,这也是block的本质。

"_"(下划线)修饰的变量循环引用如何解决

{
  NSMutableArray* _objects;
}
 __weak typeof(self) weakSelf = self;
 self.someBlock = ^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    [strongSelf->objects addObject:object];
 };

因为,_object被编译成->objects。

这些平时用的很少的block精华,你都了解多少呀?

相关文章

  • block底层那些你不知道的事

    如果block只掌握了怎么去应用,那了解了block的皮毛。若想要精通block,非得了解block的本质不行! ...

  • Block经典问题循环引用&解决

    Block内存关系Block经典问题循环引用&解决Block底层分析Block底层HooK 1.循环引用怎么产生的...

  • Block探索

    Block内存关系Block经典问题循环引用&解决Block底层分析Block底层HooK 程序占用内存分类 栈区...

  • Block底层分析

    Block内存关系Block经典问题循环引用&解决Block底层分析Block底层HooK 1. 研究工具:cla...

  • Block底层原理分析

    iOSBlock底层原理解析 目录 Block底层解析什么是block?block编译转换结构block实际结构b...

  • block分析(下)

    block通过clang分析 带着下面的疑问,我们去探索block原理 探索block底层源码 block在底层是...

  • 06-OC中block的底层原理

    06-block的本质 在讲解block的底层原理前,我们先抛出如下block相关的问题: block的本质,底层...

  • Block底层hook

    Block内存关系Block经典问题循环引用&解决Block底层分析Block底层HooK 前言 如何反编译出微信...

  • iOS底层探索之Block(二)——如何解决Block循环引用问

    Block你知道几种?Block的循环引用你有几种解决办法呢? iOS底层探索之Block(一)——初识Block...

  • iOS开发——block底层实现与变量捕获

    前言 首发地址:block底层实现与变量捕获 带着问题阅读 block的本质是什么?你能讲出来它的底层结构吗? 全...

网友评论

    本文标题:block底层那些你不知道的事

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