Categories
雖然我們知道這樣寫很醜, 但是我們應該要在我們的 category 方法前加上自己的小寫字首以及下劃線,比如- (id)zoc_myCategoryMethod
。 這種實踐同樣被蘋果推薦。
這是非常必要的。因為如果在擴充套件的 category 或者其他 category 裡面已經使用了同樣的方法名,會導致不可預計的後果。實際上,實際被呼叫的是最後被載入的那個 category 中方法的實現(譯者注:如果匯入的多個 category 中有一些同名的方法匯入到類裡時,最終呼叫哪個是由編譯時的載入順序來決定的,最後一個載入進來的方法會覆蓋之前的方法)。
如果想要確認你的分類方法沒有覆蓋其他實現的話,可以把環境變數 OBJC_PRINT_REPLACED_METHODS 設定為 YES,這樣那些被取代的方法名字會列印到 Console 中。現在 LLVM 5.1 不會為此發出任何警告和錯誤提示,所以自己小心不要在分類中過載方法。
一個好的實踐是在 category 名中使用字首。
** 例子 **
@interface NSDate (ZOCTimeExtensions)
- (NSString *)zoc_timeAgoShort;
@end
** 不要這樣 **
@interface NSDate (ZOCTimeExtensions)
- (NSString *)timeAgoShort;
@end
分類可以用來在標頭檔案中定義一組功能相似的方法。這是在 Apple的 Framework 也很常見的一個實踐(下面例子的取自NSDate
標頭檔案)。我們也強烈建議在自己的程式碼中這樣使用。
我們的經驗是,建立一組分類對以後的重構十分有幫助。一個類的介面增加的時候,可能意味著你的類做了太多事情,違背了類的單一功能原則。
之前創造的方法分組可以用來更好地進行不同功能的表示,並且把類打破在更多自我包含的組成部分裡。
@interface NSDate : NSObject <NSCopying, NSSecureCoding>
@property (readonly) NSTimeInterval timeIntervalSinceReferenceDate;
@end
@interface NSDate (NSDateCreation)
+ (instancetype)date;
+ (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
+ (instancetype)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti;
+ (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;
+ (instancetype)dateWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date;
// ...
@end