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

Objective-C Category (分類) 完整指南:動態擴展類方法的實戰技巧

     編輯:關於C語言

Category 核心概念

Category 允許在**不創建子類**的情況下,為現有類動態添加方法。編譯時期合併到類元數據,運行時無區別。核心限制:**不能添加實例變量 (ivars)**。

聲明與實現語法

方式一:獨立文件 (推薦)


// NSString+JSON.h
#import 

@interface NSString (JSON)
- (id)jsonObject;  // 解析 JSON 字符串
- (BOOL)isValidJSON;
@end

// NSString+JSON.m
#import "NSString+JSON.h"

@implementation NSString (JSON)
- (id)jsonObject {
    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
    return [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
}
- (BOOL)isValidJSON {
    return [self jsonObject] != nil;
}
@end

方式二:同文件多 @interface (教學用)


// Student.h
@interface Student : NSObject
- (void)study;
@end

// Student 分類
@interface Student (Sports)
- (void)playBasketball;
@end

// Student.m
@implementation Student
- (void)study { NSLog(@"Studying..."); }
@end

@implementation Student (Sports)
- (void)playBasketball { NSLog(@"Playing basketball!"); }
@end

Category 三大核心限制

1. 不能添加實例變量
@interface MyClass (Category) { int newVar; } → 編譯錯誤。
替代:關聯對象 objc_setAssociatedObject / objc_getAssociatedObject。
2. 方法名衝突風險
多個 Category 定義同名方法 → 行為未定義 (取決於加載順序)。
規範:方法名前加前綴 myPrefix_methodName。
3. 不能重寫父類方法 (技術上可但極危險)
Category 中實現父類方法會覆蓋原實現,且無法調用 super。
禁忌:永遠不要在 Category 中重寫繼承鏈上的方法。

關聯對象:突破無 ivar 限制


#import 

static const char *KEY = "customProperty";

@implementation NSObject (CustomProperty)
- (void)setCustomProperty:(id)value {
    objc_setAssociatedObject(self, KEY, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (id)customProperty {
    return objc_getAssociatedObject(self, KEY);
}
@end

關聯策略:OBJC_ASSOCIATION_ASSIGN/RETAIN/COPY × _NONATOMIC/_ATOMIC,對應屬性修飾符。

四大典型應用場景

場景例子優勢
系統類擴展NSString+JSON, UIColor+Hex, UIView+AutoLayout無需繼承、調用語法自然
大類拆分ViewController+Networking, +UISetup, +DataSource模塊化、團隊並行開發
私有方法組織ClassName+Private.h/.m隱藏實現細節、.h 保持乾淨
協議實現分離ClassName+UITableViewDelegate關注點分離、文件結構清晰

Category vs Extension (類擴展)

運行時原理

編譯器將 Category 方法編譯為獨立元數據結構 (category_t),App 啟動時 dyld 加載,Runtime 將方法列表合併到類的 method_list。同名方法後加載者勝出 (覆蓋)。

總結

Category 是 Objective-C 動態性的集中體現:**無侵入式擴展**、**模塊化組織代碼**、**適配系統類**。遵守「不加 ivar、不重寫父類、加前綴避衝突」三大鐵律,善用關聯對象補充狀態,即可安全高效地使用 Category 提升代碼可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性CategoryExtension (匿名分類)
語法@interface Class (Name)@interface Class ()
可加 ivar❌✅ (在 .m 中)
可見性公開 (導入頭文件即可用)私有 (僅實現文件可見)
聲明位置.h 文件.m 文件頂部