iOS继承中子类如何调用父类私有方法

iOS继承中子类如何调用父类私有方法,第1张

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()

    }

}

这样是没有问题的


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11832031.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存