摘錄
主類執(zhí)行了foo方法,分類也執(zhí)行了foo方法殷蛇,在執(zhí)行的地方執(zhí)行了foo方法实夹,主類的foo會被覆蓋么? 如果想只想執(zhí)行主類的foo方法晾咪,如何去做收擦?
主類的方法被分類的foo覆蓋了,其實分類并沒有覆蓋主類的foo方法谍倦,只是分類的方法排在方法列表前面塞赂,主類的方法列表被擠到了后面, 調用的時候會首先找到第一次出現(xiàn)的方法昼蛀。
如果想要只是執(zhí)行主類的方法宴猾,可逆序遍歷方法列表,第一次遍歷到的foo方法就是主類的方法
- (void)foo{
[類 invokeOriginalMethod:self selector:_cmd];
}
+ (void)invokeOriginalMethod:(id)target selector:(SEL)selector {
uint count;
Method *list = class_copyMethodList([target class], &count);
for ( int i = count - 1 ; i >= 0; i--) {
Method method = list[i];
SEL name = method_getName(method);
IMP imp = method_getImplementation(method);
if (name == selector) {
((void (*)(id, SEL))imp)(target, name);
break;
}
}
free(list);
}