我可以收到发送零对象消息的警告吗?

问题描述:

我知道将消息发送到Objective-C中的零对象是完全正确的。不过,我很好奇是否有任何运行时支持来标记这种情况。我可以看到这在测试/调试情况下很有用。我可以收到发送零对象消息的警告吗?

在调试器摆弄了一下之后,我发现了这一点。

您可以objc_msgSend与断点条件的第一个参数设置一个断点为零(接收):

  1. 打开“断点”窗口:命令选项-B
  2. 双击最后一行上创建一个新的符号断点
  3. 输入符号:objc_msgSend
  4. 在“条件”列中输入条件:*(int*)($esp+4) == 0

当您运行可执行文件时,它会经常中断,因为发送消息到nil非常常见。要了解发生了什么的概述,您可以进一步配置断点:

  1. 按加号按钮添加断点命令。
  2. 从弹出窗口中选择“调试器命令”。
  3. 在命令字段中输入p (char*)*(int*)($esp+8)
  4. 单击断点行(一个在最后一列的小箭头)

如果现在继续执行,你会在“自动继续”复选框在调试器控制台中查看所有消息名称(发送到零)。

以上所有内容仅适用于Intel Mac(模拟器中的32位Cocoa或Cocoa Touch)。 PPC或ARM体系结构使用其他寄存器名称和调用约定。我把它作为一个练习,你找出如何让这些平台上的这方面的工作;)

另外,也可以使用DTrace:

Using dtrace to log traces messages-to-nil

这样就可以done in Instruments,太。

+0

我已将您的博客添加到我的RSS - 伟大的东西。 – nall 2009-10-15 22:36:45

+0

很酷。我在待办事项列表上有更多的帖子。只需要找到时间。 – bbum 2009-10-16 05:42:37