Objective-c的block(块)

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赋值,作为函数参数,甚至作为函数返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值