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直接调用该方法。
直接调用即可。公有方法只是说执行权限是公有的,但是方法仍然定义在该类中,其他类是没有权限修改的,因此直接调用私有方法并不会导致权限溢出。
至于继承关系,你只要搞清楚哪些函数来自继承,哪些来自重写就可以知道他们的私有公有属性,和这个无关(只要是protected级别以上都可以调用)
public class Test {private void privateMethod() {
}
public void publicMethod() {
privateMethod()
}
}
这样是没有问题的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)