Block 是 Objective-C 的匿名函數/閉包實現,語法以 ^ 開頭。可作為變量賦值、參數傳遞、返回值使用。
// 使用 typedef 簡化
typedef int (^IntBlock)(int, int);
typedef void (^VoidBlock)(int);
// 直接聲明變量
int (^block1)(int, int) = ^(int x, int y) {
return x + y;
};
IntBlock block = ^(int x, int y) { return x + y; };
NSLog(@"%d", block(1, 1)); // 輸出 2
int result = block1(10, 34); // 輸出 44
Block 內部可訪問外部作用域變量,但有限制:
__block 修飾符:允許修改局部變量,變量移至堆/全局區__block int x = 10;
int n = 0; // 全局
VoidBlock block5 = ^(int num) {
x++; // 允許修改
n++; // 全局變量可直接修改
NSLog(@"x=%d, num=%d", x, num);
};
block5(5); // x 變為 11
假設 Car 模型含 price、maxSpeed 屬性。
sortUsingComparator:NSMutableArray *cars = [NSMutableArray arrayWithObjects:car1, car2, car3, car4, nil];
// 價格降序
[cars sortUsingComparator:^NSComparisonResult(Car *obj1, Car *obj2) {
if ([obj1 price] < [obj2 price]) return NSOrderedDescending;
if ([obj1 price] == [obj2 price]) return NSOrderedSame;
return NSOrderedAscending;
}];
sortedArrayUsingComparator:NSArray *sortedBySpeed = [cars sortedArrayUsingComparator:^NSComparisonResult(Car *obj1, Car *obj2) {
if ([obj1 maxSpeed] < [obj2 maxSpeed]) return NSOrderedDescending;
if ([obj1 maxSpeed] == [obj2 maxSpeed]) return NSOrderedSame;
return NSOrderedAscending;
}];
NSComparisonResult (^speedBlock)(Car *, Car *) = ^(Car *o1, Car *o2) {
if ([o1 maxSpeed] < [o2 maxSpeed]) return NSOrderedDescending;
if ([o1 maxSpeed] == [o2 maxSpeed]) return NSOrderedSame;
return NSOrderedAscending;
};
[cars sortUsingComparator:speedBlock];
// 字符串
NSString *str = @"Literals";
// 數組
NSArray *arr = @[@"1", @"2", @"3"];
// 字典
NSDictionary *dic = @{@"name": @"zhangsan", @"age": @"6"};
// 數字封裝
NSNumber *num = @123;
__block 變量存儲於堆區,引用計數管理NSComparisonResult:NSOrderedAscending(-1)、NSOrderedSame(0)、NSOrderedDescending(1)sortUsingComparator: 修改原數組;sortedArrayUsingComparator: 返回新數組