【问题标题】:Need an iPhone Programmer judge every step and every pointer == nil?需要 iPhone 程序员判断每一步和每个指针 == nil?
【发布时间】:2011-07-03 11:03:13
【问题描述】:

例如:

NSString *myString = [[NSString alloc] init];
if (nil == myString) {
    return;
}

需要我这样做吗??谢谢!

【问题讨论】:

  • 我认为 [nil message] 是可以的,所以你只需要在不涉及对象时检查更具体的问题,并且当一连串这样的静默失败可能导致需要明确的问题时托管

标签: iphone objective-c pointers


【解决方案1】:

不,您不需要这样做,而且我不能说我曾经见过广泛使用该模式的代码。

另外,if 语句可以缩短为:

if (! myString) {
    return;
}

...这是等效的,但同样是多余的。检查nil 可能很有用,但通常不会在对象实例化后立即进行。相反,典型的情况是这样做以确保对象不会过度释放,例如使用如下模式:

if (myObj) {
    [myObj release];
    myObj = nil;
}

请注意,在 Objective-C 中允许在 nil 上调用任何方法,因此与在 Java 等语言中尝试使用 null 引用做任何事情时相比,浮动的意外 nil 值造成的伤害更小。一个例外。

【讨论】:

  • 你的第二个 sn-p 没有意义。如果myObjnil,那么在其上调用release 将无效。在这种情况下,绝对没有理由检查nil——它不能“确保对象没有过度释放”。
  • @Josh Caswell - 你对if很感兴趣。确保myObj 不会过度发布的部分是[myObj release] 之后的myObj = nil 行。 if 除了可读性和防止对[nil release] 的无意义调用和对nil = nil 的无意义分配之外,没有其他用途。
  • 不知道为什么我“着迷”,因为if 是问题所在,你的回答是什么:«检查nil 可能很有用......典型案例是这样做...»,但没关系。
【解决方案2】:

Objective-C 允许调用 nil 指针,这与许多其他语言不同,并且允许跳过一些检查。当然,在某些特定情况下检查 == nil 仍然是明智的,但是,您不必检查代码中的每一步。查看 Apple 的文档和示例,并尝试遵循他们的风格。

【讨论】:

    【解决方案3】:

    坦率地说,如今生成的大多数 iPhone 应用程序代码都假定堆外条件(这种简单的实例化操作失败的唯一合乎逻辑的原因)在正常操作中永远不会发生。只有在创建大型(例如,图像)对象时才可能检查分配失败。

    当然,init 例程可能由于多种原因而失败,因此可能需要在复杂的实例化操作之后检查 nil(取决于对象类型)。 (请记住,某些对象的许多其他方法在某些情况下也可能返回 nil,因此您需要相应地阅读规范和代码。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2010-09-28
      • 2011-05-07
      • 2011-06-03
      相关资源
      最近更新 更多