Objective-c:Block

# Block 概述

标准C里面没有Block, C语言的后期扩展版本, 加入了匿名函数; C++、JS、 Swift等语言中, 有类似语法, 叫做闭包!

block语法和函数指针很相似。回顾, C语言中的指针函数:

c
int(*) (int x, int y)

即: 指向两个整型参数, 一个整型返回值函数的指针!

Block函数, 没有名称的函数,例如:

int(int x, int y)

因为Block是匿名函数, block变量存放函数的实现, 通过block变量能直接调用函数, 没有名称的函数该如何调用呢? (有名称的话, 可以直接调用, 也可以通过函数指针来调用)

例如定义C语言的函数指针!

int sum(int a, int b) {
    return a + b;
}

// 定义函数
int (*p)(int, int) = sum;
NSLog(@"%ld", p(10, 10)); // 20

// 函数指针类型:int (*) (int, int)
// 函数指针变量:p
// 函数指针的值:sum

看看block语法:

 block类型: int(^)(int, int)  
 block变量: block
 block的值: ^(int a, int b){ 
               return a + b ;
            };

定义block语法块:

int (^block)(int int) = ^(int a, int b) {
     return a + b;
}

# Block 类型

// 1. 无参数无返回值
void(^sayHello)(void) = ^(void) {
    NSLog(@"Hello!");
};

// 2. 有参数无返回值
void(^sayHelloWith)(char *) = ^(char *name) {
    NSLog(@"Hello, %s!", name);
};

// 3. 无参数有返回值
int (^getNumber)(void) = ^(void){
    return 10;
};

// 4. 有参数有返回值
int (^sum)(int, int) = ^(int a, int b) {
    return a + b;
};

# __block

如果要在 block 内部修改在 block 外面定义的变量,需在定义该变量时添加 __block 修饰符(两个下划线),如下所示:

__block int a = 10;
void(^block)(void) = ^(){
    a = 20;
};
block();
NSLog(@"%d", a);

# 使用 typedef

// 定义block类型
typedef void(^block) (int, int);

// 定义block变量并赋值
block sum = ^(int a, int b) {
    NSLog(@"%d", a + b);
};

// 调用block
sum(10, 10);

# Block 回调

定义一个 Tools 的类,声明如下方法:

- (void)sumWith:(int)a b:(int)b callback:(void(^)(int res))callback;

实现 Tools 方法:

- (void)sumWith:(int)a b:(int)b callback:(void (^)(int))callback {
    callback(a + b);
}

main 函数中调用:

[[Tools new] sumWith:10 b:10 callback:^(int res) {
    NSLog(@"%d", res);
}];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值