Category 高级使用

本文探讨了Objective-C中类别方法如何与原有类方法共存,并非完全替换,而是通过方法列表顺序实现覆盖效果。文章还介绍了如何调用被类别覆盖的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、分类会覆盖本类的方法?

1. category的方法没有“完全替换掉”原来类已经有的方法,也就是说如果category和原来类都有methodA,那么category附加完成之后,类的方法列表里会有两个methodA
2. category的方法被放到了新方法列表的前面,而原来类的方法被放到了新方法列表的后面,这也就是我们平常所说的category的方法会“覆盖”掉原来类的同名方法,这是因为运行时在查找方法的时候是顺着方法列表的顺序查找的,它只要一找到对应名字的方法,就会罢休^_^,殊不知后面可能还有一样名字的方法

2、如何调用被分类覆盖的方法?
/*怎么调用到原来类中被category覆盖掉的方法?
对于这个问题,我们已经知道category其实并不是完全替换掉原来类的同名方法,只是category在方法列表的前面而已,所以我们只要顺着方法列表找到最后一个对应名字的方法,就可以调用原来类的方法:
 */
 + (void)useClassMethodInsteadCayegoryMethod: (SEL)seletor {  
 if (self) {  
 unsigned int methodCount;  
 Method *methodList = class_copyMethodList([self class], &methodCount);  
 IMP lastImp = NULL;  
 SEL lastSel = NULL;  
  for (NSInteger i = 0; i < methodCount; i++) {  
 Method method = methodList[i];  
 NSString *methodName = [NSString stringWithCString:sel_getName(method_getName(method)) encoding:NSUTF8StringEncoding];  
 NSString *selectorName = NSStringFromSelector(seletor);  
 if ([selectorName isEqualToString:methodName]) {  
 lastImp = method_getImplementation(method);  
 lastSel = method_getName(method);  
}  
 }  
 typedef void (*fn)(id,SEL);  
 if (lastImp != NULL) {  
 fn f = (fn)lastImp;  
 f(self,lastSel);  
 }  
 free(methodList);  
 }}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值