捕获对象上的所有方法/消息调用
如何在对象上放置一个“钩子”,以便我可以看到正在向其发送哪些消息? (即每次将消息发送到对象时都执行 NSLog() )。
我记得以前见过这个,但我忘记了是怎么做的。我想这可能会帮助我找出部分代码不起作用的原因。
How do I put a "hook" on an object so I can see what messages are being sent to it? (ie do an NSLog() every time a message is sent to an object).
I think recall seeing this done before but I forget how. I am thinking it might help me track down why part of my code is not working.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您还可以使用 objective-c 转发。基本上,您可以创建一个代理对象来记录方法,然后将调用转发给原始对象。有关更多详细信息,请参阅我的博客文章。
You can also use objective-c forwarding. Basically you can create a proxy object that logs the methods then forwards the call to the original. See my blog post for more details.
执行此操作的最佳方法是使用 dtrace 或仪器脚本。使用 dtrace,您可以执行以下操作:
将以下脚本编写为 objc-calls.d
然后使用该脚本运行应用程序:
您还可以使用类似的 dtrace 探针构建自定义 Instrument。
The best way to do this is with dtrace or an instruments script. Using dtrace you can do the following:
Write the following script as objc-calls.d
Then run the app using the script:
You can also build a custom Instrument using a similiar dtrace probe.
继 Louis Gerbarg 去年的评论之后,能够轻松地按类名进行过滤也很有用。
尝试以下 D 脚本:
保存它,
chmod a+x objc-calls.d
,然后执行sudo objc-calls.d -c /Your/Binary NSObject
仅查看与 NSObject(及其类别)相关的调用。Following up on Louis Gerbarg's comment from last year, it's also useful to be able to easily filter by class name.
Try the following D script:
Save it,
chmod a+x objc-calls.d
, and then dosudo objc-calls.d -c /Your/Binary NSObject
to see just the invocations related to NSObject (and its categories).您可以使用
NSProxy
对象并重写forwardInitation:
方法。You could use a
NSProxy
object and override theforwardInvocation:
method.