- **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
分類特點(diǎn)
-
在不知道類代碼的情況下,可以給類增加方法。
項(xiàng)目中,經(jīng)常以分類的方式,減少重復(fù)代碼以及保持代碼的一致性。比如:項(xiàng)目中需要統(tǒng)一設(shè)置UIButton的UIControlStateNormal和UIControlStateSelected顏色,可以建UIColor的分類,新增方法來(lái)解決。好處是后期修改方便,而且可以避免寫錯(cuò)等。
說(shuō)起增加方法,繼承也可以做到這種目的,但繼承明顯感覺比重高。
-
分類可以拆分一個(gè)類的方法到多個(gè)文件中
創(chuàng)建分類時(shí)可以根據(jù)業(yè)務(wù)將方法分開到多個(gè)文件中。比如Downloader的分類,可以創(chuàng)建Downloader+Image.h,Downloader+Movie.h等分類。尤其在大的項(xiàng)目中,這個(gè)可以大量節(jié)省修改一個(gè)方法導(dǎo)致編譯重新連接耗時(shí)時(shí)間長(zhǎng)。
以此反向推測(cè): 一個(gè)類可以多個(gè)分類組成,在該類的.h中導(dǎo)入這些分類即可。
-
覆蓋(重寫)原類的方法
能覆蓋類方法的原因是runtime中分類加載時(shí)機(jī)在類之后。
可以利用該特點(diǎn),不用繼承子類可以修復(fù)類方法的bug。
這里有個(gè)問題是,如果一個(gè)類的兩個(gè)分類,都重寫了同一個(gè)方法,那么在runtime中到底哪個(gè)分類后執(zhí)行覆蓋是個(gè)不確定的,有些資料顯示以編譯器以Build Phases -> Compile Source文件順序決定(從高到低),即使這樣,這規(guī)則太隱含了,不可采取,還是去修改類的方法為上上策。
-
分類不能添加成員變量
在分類中添加Propery時(shí),只會(huì)生成該屬性的get,set方法的聲明,而不會(huì)生成實(shí)現(xiàn)。
-
分類的方法中,不可以調(diào)用super方法
因?yàn)榉诸愐呀?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
擴(kuò)展特點(diǎn),上面代碼
@interface Person ()就是EXTENSION
-
可以添加該類的私有成員變量,屬性
擴(kuò)展的.h文件只能在類的.m中導(dǎo)入,這樣類中才能訪問成員變量。
-
可以聲明方法
聲明的方法必須在類中實(shí)現(xiàn),否則編譯器會(huì)警告??。
-
匿名分類
說(shuō)到擴(kuò)展,都會(huì)提到匿名分類這個(gè)詞。
如有錯(cuò)誤,歡迎糾正。