【问题标题】:Is checking if not nil before sending a release message good practice?在发送发布消息之前检查是否为 nil 是一种好习惯吗?
【发布时间】:2008-11-25 23:48:27
【问题描述】:

当释放一个可能存在或不存在的实例时,我通常这样写:

if (object != nil) [对象释放];

但是既然向 nil 发送消息是没有问题的,那么这个条件是必要的吗?

我想问题归结为:哪个使用更多开销,将对象与 nil 进行比较,还是向 nil 发送消息?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    请参阅this page,它解释了将消息传递给 nil(概括您的示例)非常好。

    至于什么开销更大,任何性能影响对系统整体性能的影响都可以忽略不计(不要养成过早优化的习惯)。

    【讨论】:

    • 发送消息将进行 nil 检查,因此单独进行 nil 检查不是优化。这是一种反优化。
    【解决方案2】:

    当我编写比 Obj-C 更多的 C++ 代码时,我总是会编写代码来检查 nil ——因为这是对我自己的一个说明,允许此指针为 nil。现在,我让objc_msgSend 处理它,因为假设任何指针都可以有效地是nil,我已经更习惯于阅读代码。

    在“安全编码”级别上,我认为在每次发布后始终将指针设置为nil 更为重要(可能在dealloc 方法中排除release)。这样,您可以确保您的指针永远不会无效(它要么是有效的,要么是nil)。

    【讨论】:

      【解决方案3】:

      该检查不是必需的。除非您对此代码进行大量迭代(10,000 次,可能更多),否则时间差异是微不足道的。

      【讨论】:

      • 即便如此,您也应该在进行任何优化之前使用分析器。
      【解决方案4】:

      Obj-C 会检查nil,所以不需要重复两次。

      [object release]; object = nil;
      

      如果你想在那里添加一些额外的代码,最好将指针 设置为 nil,这样它就不会受到双重释放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多