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

Objective-C 可變參數方法實現指南:va_list 與可變參數 API 設計

     編輯:關於C語言

Objective-C 可變參數方法實現指南:va_list 與可變參數 API 設計

Cocoa 框架大量使用可變參數方法(如 initWithFormat:、UIAlertView 初始化)。自定義類同樣可通過 va_list 實現靈活的參數列表。

語法規則

  • 固定參數在前,可變參數在後,以 , ... 結尾。
  • 可變參數類型必須一致(通常為 id)。
  • 調用時必須以 nil 結尾作為哨兵。

實現示例:做一頓豐盛大餐

@interface Man : NSObject
- (NSString *)makeMilk:(NSString *)milk fruit:(NSString *)fruit food:(NSString *)food, ...;
@end

@implementation Man
- (NSString *)makeMilk:(NSString *)milk fruit:(NSString *)fruit food:(NSString *)food, ... {
    NSMutableArray *arr = [NSMutableArray array];
    if (food) {
        va_list params;
        va_start(params, food);  // 從 food 之後開始
        id argument;
        while ((argument = va_arg(params, id))) {  // nil 結束
            [arr addObject:argument];
        }
        va_end(params);
    }
    return [NSString stringWithFormat:@"%@_%@_%@", milk, fruit, [arr componentsJoinedByString:@"_"]];
}
@end

調用方式

Man *man = [[Man alloc] init];
NSString *result = [man makeMilk:@"馬奶" fruit:@"蘋果" food:@"魚兒", @"肉兒", @"雞兒", @"鴨兒", @"鵝兒", nil];
// 結果:馬奶_蘋果_魚兒_肉兒_雞兒_鴨兒_鵝兒

關鍵宏說明

  • va_list:指向可變參數列表的不透明指針。
  • va_start(ap, lastFixed):初始化 ap 指向第一個可變參數。
  • va_arg(ap, type):取出當前參數並移動到下一個。
  • va_end(ap):清理資源(某些架構需調整棧指針)。

應用場景

  • 網絡請求參數序列化
  • 數據庫動態條件構建
  • 日志格式化輸出
  • 集合構建器(如 arrayWithObjects:)

掌握 va_list 可讓你設計出極具表達力的 Objective-C API,貼合 Cocoa 風格。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved