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

时间:2009-10-15 16:22:31

标签: objective-c testing runtime warnings null

我知道在Objective-C中向nil对象发送消息是完全正常的。但是,我很好奇是否有任何运行时支持来标记这种情况。我可以看到这在测试/调试情况下很有用。

2 个答案:

答案 0 :(得分:15)

在调试器稍微摆弄之后,这就是我发现的。

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

  1. 打开“断点”窗口:Command-Option-B
  2. 双击最后一行以创建新的符号断点
  3. 输入符号:objc_msgSend
  4. 在“条件”列中输入条件:*(int*)($esp+4) == 0
  5. 当您运行可执行文件时,它会经常中断,因为将消息发送到nil是很常见的。要了解正在发生的事情,您可以进一步配置断点:

    1. 按加号按钮添加断点命令。
    2. 从弹出窗口中选择“Debugger Command”。
    3. 在命令字段
    4. 中输入p (char*)*(int*)($esp+8)
    5. 点击断点行中的“自动继续”复选框(最后一列中带有小箭头的复选框)
    6. 现在继续执行时,您将在调试器控制台中看到所有消息名称(发送到nil)。

      上述所有内容仅适用于Intel Macs(模拟器中的32位Cocoa或Cocoa Touch)。 PPC或ARM体系结构使用其他寄存器名称和调用约定。我将它作为练习留给您,以了解如何在这些平台上运行;)

答案 1 :(得分:4)

或者,您可以使用dtrace:

Using dtrace to log traces messages-to-nil

这也可以是done in Instruments