類別 是 Objective-C 獨有的強大機制,允許在不修改原類代碼、不創建子類的情況下,為現有類添加新方法。廣泛用於系統框架擴展、代碼模塊化、方法分組管理。
ClassName+CategoryName(如 NSString+Revert)#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic, strong) NSString *name; - (void)test; - (void)eat; @end // 同一文件聲明多個類別 @interface Person (Creation) - (id)initWithName:(NSString *)aName; @end @interface Person (Life) - (void)eat; - (void)sleep; - (void)play; @end
#import "Person.h"
@implementation Person
- (void)test { NSLog(@"這是原有類的一個方法"); }
- (void)eat { NSLog(@"這是原有類的 eat"); }
@end
@implementation Person (Creation)
- (id)initWithName:(NSString *)aName {
self = [super init];
if (self) { self.name = aName; }
return self;
}
@end
@implementation Person (Life)
- (void)eat { NSLog(@"他需要吃飯"); } // 覆蓋原類方法(警告但生效)
- (void)sleep { NSLog(@"他需要睡覺"); }
- (void)play { NSLog(@"他需要玩耍"); }
@end
#import <Foundation/Foundation.h> @interface NSArray (Convert) + (NSMutableArray *)arrayFromNumber:(int)number; @end
#import "NSArray+Convert.h"
@implementation NSArray (Convert)
+ (NSMutableArray *)arrayFromNumber:(int)number {
NSMutableArray *numberArray = [NSMutableArray array];
while (number) {
int last = number % 10;
number /= 10;
[numberArray addObject:@(last)];
}
return numberArray;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
#import "NSArray+Convert.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 測試自定義類擴展
Person *jack = [[Person alloc] initWithName:@"Jack"];
NSLog(@"Person: %@", jack.name);
[jack test];
[jack eat]; // 調用類別方法(覆蓋原類)
[jack sleep];
[jack play];
// 測試系統類擴展
NSMutableArray *arr = [NSArray arrayFromNumber:123];
for (NSNumber *num in arr) {
NSLog(@"number: %@", num);
}
}
return 0;
}
Person: Jack 這是原有類的一個方法 他需要吃飯 他需要睡覺 他需要玩耍 number: 3 number: 2 number: 1
Foundation 框架大量使用類別組織代碼,如 NSArray 分為基本操作、排序、過濾、枚舉等多個類別文件,便於維護海量代碼庫。
| 需求 | 推薦方案 |
|---|---|
| 給系統類添加方法 | 類別 |
| 添加私有屬性/方法 | 擴展 |
| 需要實例變量/覆蓋核心行為 | 子類 |
| 模塊化組織大類代碼 | 類別 |