雖然我們知道這樣寫很丑, 但是我們應(yīng)該要在我們的 category 方法前加上自己的小寫前綴以及下劃線,比如- (id)zoc_myCategoryMethod
。 這種實踐同樣被蘋果推薦。
這是非常必要的。因為如果在擴展的 category 或者其他 category 里面已經(jīng)使用了同樣的方法名,會導(dǎo)致不可預(yù)計的后果。實際上,實際被調(diào)用的是最后被實現(xiàn)的那個方法。
如果想要確認你的分類方法沒有覆蓋其他實現(xiàn)的話,可以把環(huán)境變量 OBJC_PRINT_REPLACED_METHODS 設(shè)置為 YES,這樣那些被取代的方法名字會打印到 Console 中?,F(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
更多建議: