Category 是Objective-C 里面最經(jīng)常使用到的功能之1。Category 可以為已存在的類增加方法,而不需要增加1個子類。而且,我們可以在不知道某個類內(nèi)部實(shí)現(xiàn)的情況下,為該類增加方法。
注意:種別其實(shí)不能為類聲明新的實(shí)例變量,他只包括方法。
此篇文章要通過種別為類增加變量,不多說了,直接上代碼吧:
通過runtime實(shí)現(xiàn)以下代碼:
static constchar *durationKey = "duration";
- (int)getDurationTime{
return [objc_getAssociatedObject(self, &durationKey) intValue];
}
- (void)setDurationTime:(int)duration{
objc_setAssociatedObject(self, &durationKey, [NSNumber numberWithInt:duration], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
調(diào)用方式: [selfgetDurationTime];
objc所有類和對象都是c結(jié)構(gòu)體,category固然也1樣,下面是runtime
中category的結(jié)構(gòu):
1
2
3
4
5
6
7
8
|
struct _category_t {
const char *name; // 1
struct _class_t *cls; // 2
const struct _method_list_t *instance_methods; // 3
const struct _method_list_t *class_methods; // 4
const struct _protocol_list_t *protocols; // 5
const struct _prop_list_t *properties; // 6
};
|
name
注意,其實(shí)不是category小括號里寫的名字,而是類的名字cls
要擴(kuò)大的類對象,編譯期間這個值是不會有的,在app被runtime加載時才會根據(jù)name
對應(yīng)到類對象instance_methods
這個category所有的-
方法class_methods
這個category所有的+
方法protocols
這個category實(shí)現(xiàn)的protocol,比較不經(jīng)常使用在category里面實(shí)現(xiàn)協(xié)議,但是確切支持的properties
這個category所有的property,這也是category里面可以定義屬性的緣由,不過這個property不會@synthesize
實(shí)例變量,1般有需求添加實(shí)例變量屬性時會采取objc_setAssociatedObject
和objc_getAssociatedObject
方法綁定方法綁定,不過這類方法生成的與1個普通的實(shí)例變量完全是兩回事。