OC 中的動(dòng)態(tài)性管毙。
OC語(yǔ)言的動(dòng)態(tài)性主要體現(xiàn)在三個(gè)方面:動(dòng)態(tài)類型(Dynamic typing)背桐、動(dòng)態(tài)綁定(Dynamic binding)和動(dòng)態(tài)加載(Dynamic loading)关拒。
在這里我不是要說(shuō)動(dòng)態(tài)佃蚜,而是探究一下 繼承 中屬性(property)和方法(method),的動(dòng)態(tài)加載是如何實(shí)現(xiàn)的庸娱。
首先runtime 獲取class 和 child class 的 屬性列表 和方法列表着绊,來(lái)看看會(huì)怎么樣?
先看代碼:
@interface Animal : NSObject
@property(nonatomic,strong)NSString *name;
- (void)eat;
@end
@interface Cat : Animal
@end
Animal *animal = [[Animal alloc]init];
[animal eat];
Animal *cat = [[Cat alloc]init];
[cat eat];
cat 是 Animal 的子類,基本的動(dòng)態(tài)性熟尉。但我能聊得這么那個(gè)嗎归露?
先把問(wèn)題講出來(lái)啊
問(wèn)題1:繼承中子類是在如何綁定父類的屬性的?
-(void)getProperties{
u_int count = 0;
objc_property_t *properties = class_copyPropertyList([Cat class], &count);
for (int i = 0; i < count; i++) {
const char *propertyName = property_getName(properties[i]);
NSString *str = [NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding];
NSLog(@"propertyName : %@", str);
}
}
我的天啊斤儿,木有什么也木有剧包。cat 里面什么也沒(méi)有。那個(gè)屬性沒(méi)有往果,name 在哪里疆液?
問(wèn)題2:繼承中子類是在如何綁定父類的方法的?
- (void)getMethods{
unsigned int count;
Method *methods = class_copyMethodList([Cat class], &count);
for (int i = 0; i < count; i++) {
Method method = methods[i];
SEL selector = method_getName(method);
NSString *name = NSStringFromSelector(selector);
NSLog(@"method_getName:%@",name);
}
}
結(jié)果是:
精簡(jiǎn)版
method_getName:eat
method_getName:setName:
method_getName:name
有了有了陕贮,我的天啊堕油。原來(lái)在這里。繼承的子類cat里面并沒(méi)有的父類的屬性肮之,但是系統(tǒng)直接給你寫了setter 和getter 方法,這樣你就可以self.name 了掉缺,所以_name 是不行的。
給出上邊兩個(gè)問(wèn)題答案:
繼承是動(dòng)態(tài)的戈擒,只在子類中方法列表中添加了方法名眶明,屬性也是以添加setter和getter方法來(lái)實(shí)現(xiàn)的。
注意一點(diǎn)如果子類沒(méi)有實(shí)現(xiàn)父類的方法筐高,那么這個(gè)方法就在被添加進(jìn)子類的方法列表的搜囱。
希望這些分享能對(duì)大家有幫助丑瞧。