以前都知道分类和本类的方法如果如果同名(当然包括参数个数类型等均一致)时,对象调用方法时,都是优先调用分类的方法,But,why? 最近看完分类的本质(一)这篇文章以后有了一个大致的理解,这里简短的做些介绍
注:本文出现的类对象是指类本身,因为类本身也是一个对象,不是实例对象,希望不要造成困扰
- 前提 =====>
实例对象之所以可以调用分类的方法,是因为类对象(不是实例对象)会将分类的方法拷贝到类对象的方法列表,这个操作是在运行时
阶段 - 运行时阶段加载到某个类的分类(Category,Swift叫Extension),先创建一个二维数组,因为是可能有多个分类,而每个分类可能有多个方法,故初始化的是二维数组
- 然后遍历所有分类的所有方法,按序加载到初始化好的二维数组中
-
【问题的答案】
方法拷贝完以后,会将此二维数组的方法列表中方法,拷贝到原来类中,在拷贝过程中,会把分类的方法插入到原来类的方法列表的前边 - 又因为方法调用的核心是
objc_mgs(class, @selector(sel))
给 对象发送消息,然后在通过对象isa指针找到类对象,然后查找在类中查找相应方法(如果是类方法,通过类的isa查找元类,然后在元类中查找类方法)的时候,由于分类的方法在原类方法之前,故先找到的是分类的方法的实现,即先调用分类的方法,这样就原有类的方法的实现就不在响应