如何静态转储在Cocoa App中调用的所有ObjC方法?

Tod*_*orf 6 macos cocoa objective-c ios

假设我有一个基于Cocoa的Mac或iOS应用程序.我想在我的应用程序的源代码 我的应用程序的二进制文件上运行静态分析器,以检索其中调用的所有Objective-C方法的列表.有没有可以做到这一点的工具?

几点:

  1. 我正在寻找静态解决方案.我不是在寻找动态解决方案.

  2. 可以对二进制代码或源代码运行的东西是可以接受的.

  3. 理想情况下,输出只是一个大规模的Objective-C方法列表,如:

    …
    -[MyClass foo]
    …
    +[NSMutableString stringWithCapacity:]
    …
    -[NSString length]
    …
    
    (如果它没有减少那么酷)

  4. 如果存在其他类型的符号(C函数,静态变量等),那很好.

  5. 我熟悉class-dump,但是AFAIK,它将声明的Classes转储到二进制文件中,而不是二进制文件中的被调用方法.那不是我想要的.如果我错了,你可以用类转储这样做,请纠正我.

  6. 我不完全确定这是可行的.所以,如果不是,那也是一个很好的答案.:)

bbu*_*bum 10

我最了解的是otx,它是一个包装器otool,可以重建objc_msgSend()调用站点的选择器.

http://otx.osxninja.com/


use*_*472 7

如果要求查找所有方法的COMPLETE列表,那么这是静态和动态的,这是不可能的.原因是可以以各种方式调用方法,甚至可以动态地和编程地组装方法.

除了使用Objective-C消息的常规方法调用之外,[Object message]您还可以使用C-API函数调度消息objc/message.h,例如objc_msgSend(str, del).或者您可以使用NSInvocationAPI或performSelector:withObject:(以及类似的方法)调度它们,请参阅此处示例.在所有这些情况下使用的选择器可以是静态字符串,或者甚至可以使用类似的东西以编程方式从字符串构造NSSelectorFromString.

更糟糕的是,Objective-C甚至支持动态消息解析,它允许对象响应根本不对应于方法的消息!

如果您只对特定的方法调用感到满意,那么解析上面列出的模式的源代码将为您提供在执行期间可能调用的最小方法列表.但是列表可能都是不完整的(即,不包含可能被调用的方法)以及过度完成(即,可能包含在实践中未调用的方法).

  • 我认为比所有元编程奇怪更重要的是在编译时不知道接收器类型的问题,这对于确定调用什么方法是必要的.当我写`[foo length]`时,你不知道那是' - [NSString length]`,` - [FootballField length]`或`+ [SomePoorlyDesignedClass length]` - 它可能是三者的任意组合运行时,甚至是从插件加载的其他方法.因此,您可以非常高保真地确定发送*消息*,但是更多的是试图说出*方法*被调用的结果. (3认同)