Objective-c的block(块)

来源:互联网 发布:手机维修软件 编辑:程序博客网 时间:2024/06/05 11:33

block的定义语法类似C中的函数指针,在别的文章里看到一张图很形象:


与定义函数指针相比只是把*换成了^而已。


个人理解,block其实就是一种函数形式,只是在OC中给赋予了一些别的意义。其实block也通常作为回调的。

block相对于OC中的方法,不同的是,它可以定义在方法体里。它被定义后可以做为参数,或者像变量一样赋值。也可以直接运行比如:

blockname();

还有就是block对于外部的变量是可以截获的,但是外部的变量在block里都相当于是const的。因为block只会保存执行block语法瞬间的值

int anInteger = 42;     void (^testBlock)(void) = ^{        NSLog(@"Integer is: %i", anInteger);    };     anInteger = 84;     testBlock();}

输出是42。

其实block的截获变量的原理很简单,其实就是执行block语法时,把block语法表达式所使用的变量值保存到block结构体中(block的底层实现其实是c语言的结构体)。


如果想定义block能够改变的变量,必须在定义前面加__block关键字

 __block int anInteger = 42;     void (^testBlock)(void) = ^{        NSLog(@"Integer is: %i", anInteger);    };     anInteger = 84;     testBlock();

这样输出的就是84

block可以像变量一样,给定义好的block赋值,作为函数参数,甚至作为函数返回值。

0 0
原创粉丝点击