iOS類(lèi)別(Class Category)
Category在iOS開(kāi)發(fā)中使用非常的頻繁,特別是在為系統(tǒng)類(lèi)進(jìn)行拓展的時(shí)候痒蓬,我們可以不用繼承系統(tǒng)類(lèi)戳表,直接給系統(tǒng)類(lèi)添加方法帘皿,最大程度的體現(xiàn)了Objective-C的動(dòng)態(tài)語(yǔ)言特性。
#import
@interface NSObject (Category)
- (void)myMethod;
@end
這是一個(gè)最簡(jiǎn)單的Category,作用于NSObject
,給NSObject
擴(kuò)展了一個(gè)myMethod
方法.
Category的注意點(diǎn):
- Category的小括號(hào)內(nèi)一定要有名字;故Class Extension亦被稱(chēng)之為匿名分類(lèi);
#import
@interface 類(lèi)名(分類(lèi)名字)
/* 方法聲明*/
@end
@implement 類(lèi)名(分類(lèi)名字)
/*方法實(shí)現(xiàn)*/
@end
- Category的方法不一定非要在
@implement
中實(shí)現(xiàn),也可以在其他位置中實(shí)現(xiàn),但是當(dāng)調(diào)用Category的方法時(shí),依據(jù)繼承樹(shù)沒(méi)有找到該方法的實(shí)現(xiàn),程序則會(huì)崩潰;并且,Category的方法優(yōu)先級(jí)較高,可以覆蓋原類(lèi)的方法;
- Category的方法中,不可以調(diào)用super方法;
- 在實(shí)際開(kāi)發(fā)中要注意的是,Category 方法可能會(huì)覆蓋于同一個(gè)類(lèi)class 的其它 category 中的方法扳炬。但也可能被覆蓋之碗,因?yàn)椴环A(yù)知他們的加載優(yōu)先順序蝙眶,出現(xiàn)這種情況通常會(huì)在編譯時(shí)出錯(cuò)。如果在一個(gè)開(kāi)發(fā)的SDK中使用了類(lèi)別, 就最好保證類(lèi)別名不同于使用者的類(lèi)別名以及類(lèi)別方法也不同于使用者的類(lèi)別方法名幽纷, 通常通過(guò)加前綴來(lái)做到式塌。
- Category理論上不能添加成員變量,但是可以使用
@dynamic
(即運(yùn)行時(shí)Runtime)來(lái)彌補(bǔ)這種不足.
使用Category(類(lèi)別/分類(lèi))
- 對(duì)框架提供類(lèi)的擴(kuò)展(沒(méi)有源碼,不能修改);
- 不想生成一個(gè)新的子類(lèi)的情況下,例如對(duì)NSArry的擴(kuò)展;
- 方便做項(xiàng)目管理,可以將一份源碼在多個(gè)地方共享或者做方法版本管理友浸、多人協(xié)作開(kāi)發(fā)峰尝、用本地版本替換公共版本實(shí)現(xiàn)。
iOS類(lèi)擴(kuò)展(Class Extension)
- 作用:
- 能為某個(gè)類(lèi)添加成員變量,屬性,方法;
- 一般的類(lèi)擴(kuò)展寫(xiě)到.m文件中;
- 一般的私有屬性寫(xiě)到類(lèi)擴(kuò)展中
#import
@interface myClass()
{
// 成員變量
}
// 屬性
// 方法
@end
@implement
@end
- 當(dāng)需要聲明一個(gè)屬性,它對(duì)外是只讀的,但是在內(nèi)部是可以修改的,這時(shí)可以通過(guò)Extension來(lái)實(shí)現(xiàn);
//.h文件
@interface myClass : NSObject
@property (readOnly)NSString *name; // 該.h文件對(duì)外公開(kāi)
@end
//.m文件
@interface myClass ()
@property(readWrite)NSString *name;//該.m文件對(duì)外是不公開(kāi)的.當(dāng)然這里也可以放在專(zhuān)門(mén)的一個(gè).h文件中收恢,但同樣不把這個(gè)文件進(jìn)行公開(kāi)
@end
@implement myClass()
@synthesize name;
//...
@end
Category和Extension的區(qū)別
- Category的小括號(hào)中有名字,而Extension沒(méi)有;
- Category只能擴(kuò)充方法,不能擴(kuò)充成員變量和屬性;
- 如果Category聲明了聲明了一個(gè)屬性,那么Category只會(huì)生成這個(gè)屬性的set,get方法的聲明,也就不是會(huì)實(shí)現(xiàn).
//Category(類(lèi)別,分類(lèi))
@interface myClass (Category)
// 只會(huì)生成set,get方法的聲明,創(chuàng)建的對(duì)象沒(méi)有name屬性.
@property (nonatomic,copy) NSString *name;
@end
// Extension(類(lèi)擴(kuò)展)
@interface myClass
// 創(chuàng)建name成員變量,并聲明和實(shí)現(xiàn)set,get方法
@property (nonatomic,copy) NSString *name;
@end
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者