原文地址:http://ningandjiao.iteye.com/blog/1892359
在Object-C中,提供了一種動態擴展類的方式——Category,它可以動態的爲已存在的類添加新的方法,有點類似於Ruby的打開類技術,不同的是Category必須爲擴展創建一個新類,新類的名稱一般約定爲“原類名稱+擴展名”。有了這個技術之後,開發者在寫代碼時就可以從把原始的類設計得非常小,然後在功能增加時再逐步擴展,另外,可以很容易的把新添加的行爲模塊化。
Category的實現和使用方式非常簡單,比方說,在寫UI的時候,想使用自己的字體類型和字體大小,這個時候就可以嘗試使用Category擴展UIFont支持自己想用的字體和字體大小。首先創建一個Category新類,(UIFont+SnapAdditions.h)
- #import <UIKit/UIKit.h>
- @interface UIFont (SnapAdditions)
- +(id)xnl_snapFontWithSize:(CGFloat)size;
- @end
- #import "UIFont+SnapAdditions.h"
- @implementation UIFont (SnapAdditions)
- +(id)xnl_snapFontWithSize:(CGFloat)size
- {
- return [UIFont fontWithName:@"Action Man" size:size];
- }
- @end
創建好之後,在想使用該方法的類中引入Category類,然後像使用UIFont自身的方法一樣使用新的方法就行了。
- #import "UIFont+SnapAdditions.h"
- …
- self.statusLabel.font = [UIFont xnl_snapFontWithSize:16.0f];
- ...
應用場景:
- 想爲已有類(自己創建的或者SDK類庫)擴展新的方法。
- 多個團隊協作時,需要對同一個類進行修改,可以有效隔離相互影響。
注意事項:
- 新創建的Category類不能擁有自己的變量,需要自己的變量可通過繼承實現。
- 新創建的Category類會覆蓋同名的原類的方法,因此給新方法命名的時候最後特殊一點,避免覆蓋原類方法,導致不可預知的錯誤。
- 新創建的Category類雖然也有“.h”和“.m”文件,但是實現類並不需要實現所有的接口方法,只要不去調用方法就不會有問題。