iOS继承中子类如何调用父类私有方法
1、子类里通过super关键字直接调用父类公有方法。
输出结果如下:
2、子类覆盖父类方法
输出结果如下:
第一个是子类未实现同名方法overMethod,第二个是现实了同名方法overMethod
1、利用构建的方式来调用先获取父类方法,if (super_func) 是判断父类是否包含的此方法,如果含有此方法则调用,否则不调用。
2、可以利用runtime的消息发送机制。这个方法是利用遍历父类中的所有方法来判断是否包含某一方法,弊端是当这个父类方法很多时,而又需要频繁调用此方法时就会引起不必要的消耗。如果父类包含此方法就直接利用objc_msgSendSuper发送消息就可以了。
需要声明#import <objc/message.h>。
这里调用objc_msgSendSuper方法需要将ENABLE_STRICT_OBJC_MSGSEND设置为NO。
1、分类在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法,如果要重写现有类的方法,请考虑使用继承。
2、Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息
在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中),如果分类有同名方法会先调用分类同名方法。
3、利用runtime遍历主类的方法列表(包含类分类的方法),获取原类方法在方法列表中的索引,用IMP直接调用该方法。