一、简单定义
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函数中;