- **Category (以NSObject為例) **
//NSObject+NSObjectCategory.h
@interface NSObject (NSObjectCategory)
-(NSString *)className;
@end
//NSObject+NSObjectCategory.m
@implementation NSObject (NSObjectCategory)
//1.增加新方法
-(NSString *)className {
return @"NSObject";
}
//2.覆蓋原類的方法
-(NSString *)description {
return @"Description of NSObject";
}
@end
分類特點
-
在不知道類代碼的情況下眉尸,可以給類增加方法。
項目中,經(jīng)常以分類的方式男窟,減少重復(fù)代碼以及保持代碼的一致性。比如:項目中需要統(tǒng)一設(shè)置UIButton的UIControlStateNormal和UIControlStateSelected顏色贾富,可以建UIColor的分類歉眷,新增方法來解決。好處是后期修改方便颤枪,而且可以避免寫錯等汗捡。
說起增加方法,繼承也可以做到這種目的畏纲,但繼承明顯感覺比重高扇住。
-
分類可以拆分一個類的方法到多個文件中
創(chuàng)建分類時可以根據(jù)業(yè)務(wù)將方法分開到多個文件中。比如Downloader
的分類盗胀,可以創(chuàng)建Downloader+Image.h
艘蹋,Downloader+Movie.h
等分類。尤其在大的項目中读整,這個可以大量節(jié)省修改一個方法導(dǎo)致編譯重新連接耗時時間長簿训。
以此反向推測: 一個類可以多個分類組成,在該類的.h中導(dǎo)入這些分類即可米间。
-
覆蓋(重寫)原類的方法
能覆蓋類方法的原因是runtime中分類加載時機在類之后强品。
可以利用該特點,不用繼承子類可以修復(fù)類方法的bug屈糊。
這里有個問題是的榛,如果一個類的兩個分類,都重寫了同一個方法逻锐,那么在runtime中到底哪個分類后執(zhí)行覆蓋是個不確定的夫晌,有些資料顯示以編譯器以Build Phases -> Compile Source文件順序決定(從高到低),即使這樣昧诱,這規(guī)則太隱含了晓淀,不可采取,還是去修改類的方法為上上策盏档。
-
分類不能添加成員變量
在分類中添加Propery時凶掰,只會生成該屬性的get
,set
方法的聲明,而不會生成實現(xiàn)。
-
分類的方法中,不可以調(diào)用super方法
因為分類已經(jīng)在原類的角色Working懦窘。
- 分類中可以訪問原有類.h中的屬性
- Extension 最熟悉的陌生人
//Person.h
@interface Person : NSObject
- (void)test;
@end
//Person.m
#import "Person.h"
//下面這行就是Extension
@interface Person () {
int _age;
}
@end
@implementation Person
- (void)test {
NSLog(@"person test");
[self run];
NSLog(@"person test:%d", _age);
}
- (void)run {
_age = 19;
}
- (void)work {
_height = 12;
}
@end
擴展特點前翎,上面代碼
@interface Person ()
就是EXTENSION
-
可以添加該類的私有成員變量,屬性
擴展的.h文件只能在類的.m中導(dǎo)入畅涂,這樣類中才能訪問成員變量港华。
-
可以聲明方法
聲明的方法必須在類中實現(xiàn),否則編譯器會警告??午衰。
-
匿名分類
說到擴展立宜,都會提到匿名分類這個詞。
如有錯誤苇经,歡迎糾正赘理。