Tod*_*orf 6 macos cocoa objective-c ios
假设我有一个基于Cocoa的Mac或iOS应用程序.我想在我的应用程序的源代码 或我的应用程序的二进制文件上运行静态分析器,以检索其中调用的所有Objective-C方法的列表.有没有可以做到这一点的工具?
几点:
我正在寻找静态解决方案.我不是在寻找动态解决方案.
可以对二进制代码或源代码运行的东西是可以接受的.
理想情况下,输出只是一个大规模的Objective-C方法列表,如:
… -[MyClass foo] … +[NSMutableString stringWithCapacity:] … -[NSString length] …(如果它没有减少那么酷)
如果存在其他类型的符号(C函数,静态变量等),那很好.
我熟悉class-dump,但是AFAIK,它将声明的Classes转储到二进制文件中,而不是二进制文件中的被调用方法.那不是我想要的.如果我错了,你可以用类转储这样做,请纠正我.
我不完全确定这是可行的.所以,如果不是,那也是一个很好的答案.:)
如果要求查找所有方法的COMPLETE列表,那么这是静态和动态的,这是不可能的.原因是可以以各种方式调用方法,甚至可以动态地和编程地组装方法.
除了使用Objective-C消息的常规方法调用之外,[Object message]您还可以使用C-API函数调度消息objc/message.h,例如objc_msgSend(str, del).或者您可以使用NSInvocationAPI或performSelector:withObject:(以及类似的方法)调度它们,请参阅此处的示例.在所有这些情况下使用的选择器可以是静态字符串,或者甚至可以使用类似的东西以编程方式从字符串构造NSSelectorFromString.
更糟糕的是,Objective-C甚至支持动态消息解析,它允许对象响应根本不对应于方法的消息!
如果您只对特定的方法调用感到满意,那么解析上面列出的模式的源代码将为您提供在执行期间可能调用的最小方法列表.但是列表可能都是不完整的(即,不包含可能被调用的方法)以及过度完成(即,可能包含在实践中未调用的方法).