如何确定在Objective-C中是否覆盖了超类私有方法?

如何确定在Objective-C中是否覆盖了超类私有方法?,第1张

概述因为,在Objective-C中,私有方法实际上并不是私有的(方法调度机制不区分私有v / s公共方法),所以子类很容易覆盖超类的私有方法(更多关于这一点) Cocoa Coding Guidelines). 但是,检测到这一点并不容易.我正在寻找一个可以帮助我的现成工具. 这不能简单地成为静态分析工具,因为私有方法不会在界面中公开.该工具要么必须检查二进制文件,要么在运行时计算出来.据我所知,这 因为,在Objective-C中,私有方法实际上并不是私有的(方法调度机制不区分私有v / s公共方法),所以子类很容易覆盖超类的私有方法(更多关于这一点) Cocoa Coding Guidelines).

但是,检测到这一点并不容易.我正在寻找一个可以帮助我的现成工具.

这不能简单地成为静态分析工具,因为私有方法不会在界面中公开.该工具要么必须检查二进制文件,要么在运行时计算出来.据我所知,这个工具必须做类似以下的事情:

>通过检查标题获取项目使用的每个类的所有公共方法的列表,然后执行步骤2或步骤3
>通过检查二进制文件获取重写的私有方法

a)读取它链接的所有动态库的应用程序二进制文件,以获取应用程序使用的每个类定义的所有方法的列表.

b)其中,步骤1中未找到的方法是私有方法.

c)遍历类层次结构并找出覆盖私有超类方法的子类
>在运行时获取重写的私有方法

a)运行应用程序

b)使用Objective-C运行时方法,我们可以获得为所有类定义的所有方法.

c)同样,步骤1中未找到的方法是私有方法

d)遍历类层次结构并找出覆盖私有超类方法的子类

这并不总是有效 – 因为可以在运行时添加/删除类和方法,有些情况会被遗漏(最值得注意的是,NSManagedobject子类,其中在运行时提供了Core Data属性的方法).没关系,我愿意忍受这个限制.

我相信很有可能使用libclang,像otoolor nm这样的目标文件检查工具和Objective-C运行时来实现这一点,但有没有一个现成的工具可以完成所有这些工作?

注意:我不是在寻找缓解这个问题的方法;只是如何检测这种情况.

解决方法 您可以通过访问Objective-C运行时来完成此 *** 作.

请参阅objc / runtime.h,即:

/**  * Describes the instance methods implemented by a class. *  * @param cls The class you want to inspect. * @param outCount On return,contains the length of the returned array.  *  If outCount is NulL,the length is not returned. *  * @return An array of pointers of type Method describing the instance methods  *  implemented by the class—any instance methods implemented by superclasses are not included.  *  The array contains *outCount pointers followed by a NulL terminator. You must free the array with free(). *  *  If cls implements no instance methods,or cls is Nil,returns NulL and *outCount is 0. *  * @note To get the class methods of a class,use \c class_copyMethodList(object_getClass(cls),&count). * @note To get the implementations of methods that may be implemented by superclasses,*  use \c class_getInstanceMethod or \c class_getClassMethod. */OBJC_EXPORT Method *class_copyMethodList(Class cls,unsigned int *outCount)      __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0);
总结

以上是内存溢出为你收集整理的如何确定在Objective-C中是否覆盖了超类私有方法?全部内容,希望文章能够帮你解决如何确定在Objective-C中是否覆盖了超类私有方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

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

原文地址: https://outofmemory.cn/web/1072196.html

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

发表评论

登录后才能评论

评论列表(0条)

保存