OC分类与原类方法重名
2021-03-23 本文已影响0人
栀子_f1b9
关于OC的分类,网上已经有很多文章了,所以在此不再写分类与类的关系与调用顺序直接上结论:如果分类与原类存在相同的方法,那么分类的方法会合并到原类并且会在原类的方法前面,所以如果调用的类方法的时候是调用了分类里的方法。
最近几天在面试,发现面试官很喜欢问一个问题,如下:
1.我想调用原类的方法而不是分类的方法可以实现吗,怎么实现;
2.我想即调用原类的方法又调用分类的方法可以实现吗,怎么实现;
我确实没实现过,只能大体给个思路就是运用runtime,不过当时没有给出明确的方案,回来之后还是决定试试,毕竟现在这个问题,很流行?。。。。。。
直接上代码吧:
- (void)categoryTest {
Person *person = [[Person alloc] init];
unsigned int count; // 1
Method *methods = class_copyMethodList([Person class], &count);
NSInteger index = 0;
for (int i = 0; i < count; i++) {
Method method = methods[i];
SEL methodsel = method_getName(method);
NSString strName = [NSString stringWithCString:sel_getName(methodsel) encoding:NSUTF8StringEncoding];
if ([strName isEqualToString:@"test"]) {
index = i;
}
}
[person test]; //分类方法
//原类方法
SEL sel = method_getName(methods[index]);
IMP imp = method_getImplementation(methods[index]);
( (void()(id,SEL))imp)(person,sel);
}