Category是什么榛做?
Category用于向已經(jīng)存在的類添加方法來(lái)達(dá)到擴(kuò)展已有類的目的桐款。在對(duì)系統(tǒng)類進(jìn)行擴(kuò)展的時(shí)候阳柔,可以直接給系統(tǒng)類添加方法没酣。新添加的方法同樣也會(huì)被擴(kuò)展的類的所有子類自動(dòng)繼承轻专。
#import "ClassName.h"
@interface ClassName ( CategoryName )
// method declarations
- (void)method1;
@end
Category的注意點(diǎn):
1)不能在分類中重寫系統(tǒng)方法忆矛,因?yàn)闀?huì)把系統(tǒng)的功能給覆蓋掉,而且分類中不能調(diào)用super请垛。但是催训,這種情況可以用來(lái)修復(fù),沒(méi)有源碼的類中方法有Bug的情況宗收。
2)category不能給類添加實(shí)例變量漫拭。使用runtime的方式,可以給iOS添加屬性字段混稽。objc_getAssociatedObject()?objc_setAssociatedObject()
3)category添加的方法不強(qiáng)制要求在implement文件中實(shí)現(xiàn)采驻,可以利用消息轉(zhuǎn)發(fā)指定其他對(duì)象去實(shí)現(xiàn)。
Category的用途
1)無(wú)需創(chuàng)建繼承類匈勋,實(shí)現(xiàn)對(duì)已有類擴(kuò)展礼旅。并且可以被擴(kuò)展的類的所有子類自動(dòng)繼承。
2)可以用來(lái)修復(fù)沒(méi)有源碼類的bug颓影。
3)對(duì)于一個(gè)類多個(gè)開(kāi)發(fā)人員維護(hù)的情況各淀,可以根據(jù)不同用途創(chuàng)建不同分類。
Extensions
extension可以稱為匿名的category诡挂。extension聲明的方法在implement文件中一定要實(shí)現(xiàn)碎浇。extension可以添加實(shí)例變量和屬性變量临谱。extension常用的一個(gè)功能是,原類中readonly的屬性變量奴璃,可以在extension中重新聲明為readwrite悉默。并且屬性變量的讀寫方法都要在implement文件中實(shí)現(xiàn)。
如下:
//原類
@interface MyClass : NSObject
@property (retain, readonly) float value;
@end
// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, readwrite) float value;
@end