Categories

2018-08-12 21:19 更新

Categories

雖然我們知道這樣寫很丑, 但是我們應(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
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號