美文网首页
分类和本类的同名方法执行顺序

分类和本类的同名方法执行顺序

作者: 小白猿 | 来源:发表于2018-12-24 11:17 被阅读17次

    以前都知道分类和本类的方法如果如果同名(当然包括参数个数类型等均一致)时,对象调用方法时,都是优先调用分类的方法,But,why? 最近看完分类的本质(一)这篇文章以后有了一个大致的理解,这里简短的做些介绍

    注:本文出现的类对象是指类本身,因为类本身也是一个对象,不是实例对象,希望不要造成困扰

    • 前提 =====>
      实例对象之所以可以调用分类的方法,是因为类对象(不是实例对象)会将分类的方法拷贝到类对象的方法列表,这个操作是在运行时阶段
    • 运行时阶段加载到某个类的分类(Category,Swift叫Extension),先创建一个二维数组,因为是可能有多个分类,而每个分类可能有多个方法,故初始化的是二维数组
    • 然后遍历所有分类的所有方法,按序加载到初始化好的二维数组中
    • 【问题的答案】方法拷贝完以后,会将此二维数组的方法列表中方法,拷贝到原来类中,在拷贝过程中,会把分类的方法插入到原来类的方法列表的前边
    • 又因为方法调用的核心是objc_mgs(class, @selector(sel))给 对象发送消息,然后在通过对象isa指针找到类对象,然后查找在类中查找相应方法(如果是类方法,通过类的isa查找元类,然后在元类中查找类方法)的时候,由于分类的方法在原类方法之前,故先找到的是分类的方法的实现,即先调用分类的方法,这样就原有类的方法的实现就不在响应

    相关文章

      网友评论

          本文标题:分类和本类的同名方法执行顺序

          本文链接:https://www.haomeiwen.com/subject/mlvakqtx.html