首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C Block 完整指南:語法、捕獲變量與數組排序實戰

     編輯:關於C語言

Block 基礎語法

Block 是 Objective-C 的匿名函數/閉包實現,語法以 ^ 開頭。可作為變量賦值、參數傳遞、返回值使用。

1. 類型定義與聲明

// 使用 typedef 簡化
typedef int (^IntBlock)(int, int);
typedef void (^VoidBlock)(int);

// 直接聲明變量
int (^block1)(int, int) = ^(int x, int y) {
    return x + y;
};

2. 基本調用

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 屬性。

1. 就地排序 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;
}];

2. 產生新數組 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;
}];

3. 復用 Block 變量

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 本質是捕獲外部上下文的函數對象
  • __block 變量存儲於堆區,引用計數管理
  • 排序 Block 返回 NSComparisonResult:NSOrderedAscending(-1)、NSOrderedSame(0)、NSOrderedDescending(1)
  • sortUsingComparator: 修改原數組;sortedArrayUsingComparator: 返回新數組
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved