雖然我們知道這樣寫很丑, 但是我們應(yīng)該要在我們的 category 方法前加上自己的小寫前綴以及下劃線鞠评,比如- (id)zoc_myCategoryMethod
。 這種實踐同樣被蘋果推薦胸懈。
這是非常必要的。因為如果在擴展的 category 或者其他 category 里面已經(jīng)使用了同樣的方法名恰响,會導(dǎo)致不可預(yù)計的后果箫荡。實際上,實際被調(diào)用的是最后被加載的那個 category 中方法的實現(xiàn)(譯者注:如果導(dǎo)入的多個 category 中有一些同名的方法導(dǎo)入到類里時渔隶,最終調(diào)用哪個是由編譯時的加載順序來決定的羔挡,最后一個加載進來的方法會覆蓋之前的方法)。
如果想要確認(rèn)你的分類方法沒有覆蓋其他實現(xiàn)的話间唉,可以把環(huán)境變量 OBJC_PRINT_REPLACED_METHODS 設(shè)置為 YES绞灼,這樣那些被取代的方法名字會打印到 Console 中。現(xiàn)在 LLVM 5.1 不會為此發(fā)出任何警告和錯誤提示呈野,所以自己小心不要在分類中重載方法低矮。
一個好的實踐是在 category 名中使用前綴。
** 例子 **
@interface NSDate (ZOCTimeExtensions)
- (NSString *)zoc_timeAgoShort;
@end
** 不要這樣 **
@interface NSDate (ZOCTimeExtensions)
- (NSString *)timeAgoShort;
@end
分類可以用來在頭文件中定義一組功能相似的方法被冒。這是在 Apple的 Framework 也很常見的一個實踐(下面例子的取自NSDate
頭文件)军掂。我們也強烈建議在自己的代碼中這樣使用。
我們的經(jīng)驗是昨悼,創(chuàng)建一組分類對以后的重構(gòu)十分有幫助蝗锥。一個類的接口增加的時候,可能意味著你的類做了太多事情率触,違背了類的單一功能原則终议。
之前創(chuàng)造的方法分組可以用來更好地進行不同功能的表示,并且把類打破在更多自我包含的組成部分里。
@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