block的内部实现原理

时间:2022-07-30 10:02:42

一、简单定义

  block是一个指向结构体的指针,编译器将block内部代码生成对应的函数,上述结构体中的函数指针(funcPtr)指向该函数的实现;

二、相关概念

  形参和实参

  形参:形式参数,用于定义方法,目的是接收方法调用时传递的参数。定义形参不会分配内存,只有调用时才会分配内存,一旦调用结束,就会释放内存;

  实参:调用方法时传递的参数,有确定的值;

  传值调用和引用调用

  传值调用:传递形参;

  引用调用:传地址,将实参赋值给了形参,形参的改变实际上都发生在实参上;

三、举例说明

  先看两个block的实现

float height = 10.4;
void (^block)() = ^{
    NSLog(@"%f",height);
};
height = 18.0;
block();

// 打印结果为10.4
__block float height = 10.4;
void (^block)() = ^{
    NSLog(@"%f",height);
};
height = 18.0;
block();

// 打印结果为18.0

  出现此现象的原因可概括为值传递和引用传递,下面通过解析函数的实现,解释这个现象

  使用终端,转到mian.m文件下,使用如下代码 clang -rewrite-objc main.m 将其编译生成 main.cpp文件 这时候,我们打开mian.cpp,在文件的最底下main函数中;

四、函数解析block的内部实现原理block的内部实现原理block的内部实现原理

五、可以通过对比图二和图三中的代码,发现二者实现的不同