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

Objective-C Category 完全指南:系統類擴展、代碼組織與私有方法實現

     編輯:關於C語言

什麼是 Category

Category (類別) 允許在不繼承、不修改原類源碼的前提下,為現有類動態添加方法。編譯時合併到類元數據中,運行時無差別調用。

  • 將大類拆分為多文件維護 (如 NSString+Encoding.h/m)
  • 為系統類 (NSString, NSArray 等) 添加便利方法
  • 實現「編譯時私有方法」 (見下文)

Category vs 繼承

特性Category繼承
能否添加實例變量不能能
能否覆蓋現有方法能 (危險,不可控)能 (override)
多文件分離編譯支持單一文件
調用超類實現需通過 runtimesuper 直接調用

命名規範

// 為 NSString 添加反轉功能
// 文件名: NSString+ReverseString.h / .m

// .h
@interface NSString (ReverseString)
- (NSString *)reversedString;
@end

// .m
@implementation NSString (ReverseString)
- (NSString *)reversedString {
    NSUInteger len = [self length];
    unichar buffer[len];
    [self getCharacters:buffer range:NSMakeRange(0, len)];
    NSMutableString *result = [NSMutableString stringWithCapacity:len];
    for (NSInteger i = len-1; i >= 0; i--) {
        [result appendFormat:@"%C", buffer[i]]; // %C 輸出 unichar
    }
    return result;
}
@end

實現「私有方法」

將 Category 聲明與實現放在 同一 .m 文件頂部,外部不可見:

// Foo.m
@interface Foo (Private) // 無對應 .h
- (void)internalHelper;
@end

@implementation Foo (Private)
- (void)internalHelper { NSLog(@"Internal called"); }
@end

@implementation Foo
- (void)publicMethod { [self internalHelper]; } // 僅內部可見
@end

注意事項

  • Category 不能添加實例變量 (需用 Associated Objects 運行時關聯)
  • 同名方法衝突:多個 Category 實現同一方法,調用哪個不可預期
  • 不能在 Category 中可靠調用 super 實現 (方法列表扁平化)
  • +load 方法在 Category 中會調用,但 +initialize 可能出現多次調用

實戰建議

  1. 為系統類添加通用工具方法 (如 NSArray+SafeAccess)
  2. 大型類按功能模塊拆分 Category (如 ViewController+Networking)
  3. 私有方法統一放在 ClassName+Private 於 .m 文件中
  4. 避免在 Category 覆蓋框架原有方法,若必須用 Method Swizzling
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved