代码
CG_INLINE BOOL
HasOverrideSuperclassMethod(Class targetClass, SEL targetSelector) {
Method method = class_getInstanceMethod(targetClass, targetSelector);
if (!method) return NO;
Method methodOfSuperclass = class_getInstanceMethod(class_getSuperclass(targetClass), targetSelector);
if (!methodOfSuperclass) return YES;
return method != methodOfSuperclass;
}
思路
- 获取A类的a方法method1
- 获取A类的父类的a方法method2
- 比较method1和method2是否相等即能判断A类是否重写了父类的a方法
原因
根据runtime的消息机制,某个类对象收到某个消息后,会先在该类的方法列表中查找该方法,如果查找不到就会到该类的父类方法列表中查找该方法。某个类如果没有重写某个方法,那么获取到的method就是该类的父类中的method。