面试题答案
一键面试1. Block基本语法结构
在Objective-C中,Block本质上是一个匿名函数,可以作为变量进行传递。其基本语法如下:
// 定义一个Block变量
returnType (^blockName)(parameterTypes) = ^returnType(parameters) {
// Block的实现代码
return value;
};
returnType
:表示Block返回值的类型,如果没有返回值则写void
。blockName
:Block变量的名称。(parameterTypes)
:表示Block接受的参数类型列表,多个参数用逗号分隔,如果没有参数可以写void
或省略。^returnType(parameters)
:这部分定义了Block的参数和返回值,^
符号表示这是一个Block的开始。{}
内是Block的具体实现代码,return value;
用于返回值(如果有返回值的话)。
例如,定义一个简单的Block,接受两个整数并返回它们的和:
int (^sumBlock)(int, int) = ^int(int a, int b) {
return a + b;
};
int result = sumBlock(3, 5); // result的值为8
2. 实际开发中使用Block的常见应用场景
异步操作回调
在进行网络请求、文件读取等异步操作时,使用Block来处理操作完成后的回调非常方便。例如,使用AFNetworking进行网络请求:
#import <AFNetworking/AFNetworking.h>
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:@"https://example.com/api/data" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 网络请求成功,处理响应数据
NSLog(@"请求成功: %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 网络请求失败,处理错误
NSLog(@"请求失败: %@", error);
}];
在这个例子中,success
和failure
参数都是Block,分别用于处理网络请求成功和失败的情况。
集合遍历操作
在对数组或字典等集合进行遍历操作时,Block可以使代码更加简洁。例如,对一个数组中的所有整数进行累加:
NSArray *numbers = @[@1, @2, @3, @4, @5];
NSNumber *total = [numbers reduce:0 usingBlock:^id _Nonnull(id _Nonnull accumulator, id _Nonnull number, NSUInteger idx, BOOL * _Nonnull stop) {
return @([accumulator integerValue] + [number integerValue]);
}];
NSLog(@"总和: %@", total);
这里reduce:usingBlock:
方法接受一个Block,在遍历数组时对每个元素执行该Block中的逻辑,从而实现累加操作。