代码之家  ›  专栏  ›  技术社区  ›  nall

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

  •  13
  • nall  · 技术社区  · 15 年前

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

    2 回复  |  直到 15 年前
        1
  •  15
  •   Nikolai Ruhe    15 年前

    在对调试程序做了一点小改动之后,我发现了这一点。

    可以在中设置断点 objc_msgSend 当第一个参数上的断点条件为零时(接收器):

    1. 打开“断点”窗口:command-option-b
    2. 双击最后一行以创建新的符号断点
    3. 输入符号: 对象代码
    4. 在“条件”列中输入条件: *(int*)($esp+4) == 0

    当运行可执行文件时,它将经常中断,因为向nil发送消息是很常见的。要了解正在发生的情况,可以进一步配置断点:

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

    当您现在继续执行时,您将看到调试器控制台中的所有消息名(发送到nil)。

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

        2
  •  4
  •   bbum    15 年前

    或者,可以使用dtrace:

    Using dtrace to log traces messages-to-nil

    这可能是 done in Instruments 也是。