Category中添加属性名冲突了怎么办

Category的同名方法覆盖并不是真的其他同名方法就消失了,而是因为系统调用方法的时候根据方法名在method_list中查找方法,找 到第一个名字匹配的方法之后就不继续往下找了。所以每次调用的都是method_list中最前面的同名方法。实际其他同名方法还在 method_list中。
所以我们可以根据selector查找到所有的同名method,然后调用

static inline void __invoke_all_method(id self, SEL selecotr) 
{  
    //1. 根据self,获取class Class class = object_getClass(self); 
     //2. 获取方法列表 uint count; Method *methodList = class_copyMethodList(class, &count); 
    //3. 遍历方法列表 for (int i = 0; i < count; i++) 
    {
         Method method = methodList[i];
         //4. 根据SEL查找方法 
        if (!sel_isEqual(selecotr, method_getName(method)))
         { continue; }
         //5. 获取方法的实现
         IMP implement = method_getImplementation(method); 
        //6. 直接调用方法的实现
         ((void(*)(id,SEL))implement)(self, selecotr); 
    } 
} 
+ (void)invokeAllClassMethodWithSelector:(SEL)selector 
{
     __invoke_all_method(self, selector); 
}

根据刚刚介绍的原理,我们封装了一个通过selector调用所有同名method的方法。

  • 根据self,获取class,如果self是实例方法的self,这里获取的是普通的class,如果self是类方法的self,这里获取的是metaClass。实例方法存放在普通class中,类方法存放在metaClass中。了解更多请看iOS开发RunTime之函数调用
  • 通过class_copyMethodList获取class的方法列表。如果class传的是metaClass,获取的是类方法的方法列表,如果class是普通class,获取的是实例方法的方法列表。
  • 遍历methodList
  • 根据SEL查找method
  • 获取IMP
  • 直接调用IMP

在系统的+initialize中,我们用invokeAllClassMethodWithSelector调用自定义 的+categoryInitialize。这时候,在category的+categoryInitialize中添加属性,就不怕Category覆盖了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,896评论 0 9
  • 转载:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麦子阅读 4,143评论 0 2
  • 一、概述 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接期所做的事推迟到运行时处理。这种动...
    Fly晴天里Fly阅读 4,966评论 0 6
  • 文中的实验代码我放在了这个项目中。 以下内容是我通过整理[这篇博客] (http://yulingtianxia....
    茗涙阅读 4,529评论 0 6
  • 本文载自: http://blog.csdn.net/a316212802/article/details/49...
    MrLuckyluke阅读 7,225评论 1 7

友情链接更多精彩内容