Category(分類) 是 Objective-C 獨有的強大機制:無需繼承、無需修改原始碼,即可為現有類別動態添加方法。它將類別的實現拆分到多個文件,實現代碼模塊化、團隊並行開發、以及對系統類別的非侵入式擴展。
ClassName+CategoryName.hClassName+CategoryName.m@interface ClassName (CategoryName)Student+Test.h
#import "Student.h" @interface Student (Test) - (void)test; @end
Student+Test.m
#import "Student+Test.h"
@implementation Student (Test)
- (void)test {
NSLog(@"調用了 Student 的 Test 分類方法");
}
@end
Main.m
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Student+Test.h"
int main() {
@autoreleasepool {
Student *stu = [[[Student alloc] initStudent:23] autorelease];
[stu test]; // 正常調用,就像原生方法一樣
}
return 0;
}
輸出:
2014-11-16 11:32:00.861 年齡為 23 的學生被創建了 2014-11-16 11:32:00.862 調用了 Student 的 Test 分類的 test 方法 2014-11-16 11:32:00.862 年齡為 23 的學生被釋放了
// NSString+JSON.h
#import <Foundation/Foundation.h>
@interface NSString (JSON)
+ (void)json; // 類方法示例
@end
// NSString+JSON.m
#import "NSString+JSON.h"
@implementation NSString (JSON)
+ (void)json {
NSLog(@"{'name':'CodingSnal', 'age':24}");
}
@end
| 場景 | 說明 | 優勢 |
|---|---|---|
| 需求變更/熱修復 | 無需修改原類別,直接新增分類文件 | 降低耦合、減少回歸風險 |
| 大型類別模塊化 | 按功能拆分:Networking、Parsing、UI 等 | 團隊並行開發、代碼清晰可維護 |
| 系統/三方庫擴展 | 為 NSString、NSArray、UIView 等添加便利方法 | 非侵入式、語法糖般的調用體驗 |
objc_setAssociatedObject)。xyz_jsonString。[super method] 仍會走原類別實現,但不建議這樣做。+load 都會在程序啟動時調用,順序不確定,慎用。@interface ClassName () 無名分類稱為 Class Extension,常用於 .m 文件頂部聲明私有屬性/方法,編譯期必須實現,屬於類別「私有擴展」;而有名 Category 則是「公開擴展」,可跨文件、跨框架使用。
Category 是 Objective-C 動態特性的集中體現:它打破了「類別定義即封閉」的傳統編程邊界,讓我們能以組合優於繼承的方式優雅地擴展功能。善用分類,能讓代碼庫保持輕量、模塊化、且對第三方庫零侵入。