MST

星途 面试题库

面试题:Objective-C中Block的基本语法及用途

请简述Objective-C中Block的基本语法结构,并举例说明在实际开发中,Block常见的用途有哪些?
48.4万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

Block基本语法结构

  1. 定义
    • 一般形式:返回值类型 (^block名称)(参数列表) = ^返回值类型(参数列表) { // 代码块内容 };
    • 例如定义一个简单的Block,计算两个整数的和:
int (^sumBlock)(int, int) = ^int(int a, int b) {
    return a + b;
};
  1. 调用:按照函数调用的方式调用定义好的Block,例如上述sumBlock的调用:
int result = sumBlock(3, 5);
NSLog(@"结果: %d", result);
  1. 简化形式
    • 当返回值类型可以由编译器推断时,可以省略返回值类型,如:
int (^sumBlock)(int, int) = ^(int a, int b) {
    return a + b;
};
  • 如果Block没有参数,参数列表可以为空(),例如:
void (^printHelloBlock)() = ^{
    NSLog(@"Hello");
};
printHelloBlock();

Block在实际开发中的常见用途

  1. 作为函数参数:在很多系统API中被广泛使用,例如dispatch_async函数用于在后台队列执行任务,它接收一个Block作为要执行的任务。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
    // 这里是在后台队列执行的代码
    NSLog(@"在后台队列执行任务");
});
  1. 事件处理:在视图控制器中,用于处理按钮点击等事件。例如,在创建一个按钮时,可以直接将点击处理逻辑写在Block中。
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:@"点击我" forState:UIControlStateNormal];
[button addTarget:self action:nil forControlEvents:UIControlEventTouchUpInside];
[button setBlock:^(id sender) {
    NSLog(@"按钮被点击了");
}];
  1. 集合遍历NSArrayNSDictionary等集合类有支持使用Block进行遍历的方法。例如,遍历数组:
NSArray *numbers = @[@1, @2, @3];
[numbers enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    NSLog(@"数组元素: %@", obj);
    if (idx == 1) {
        *stop = YES; // 停止遍历
    }
}];
  1. 延迟执行:使用dispatch_after函数结合Block可以实现延迟执行任务。
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    NSLog(@"延迟2秒执行");
});