【问题标题】:Why cannot we use the negation operator when checking for the existence of a symbol?为什么在检查符号是否存在时不能使用否定运算符?
【发布时间】:2016-01-06 05:35:41
【问题描述】:

question 的答案表明if (x != nil)if (x) 相同。

但是Apple documentation 写着:

注意:在检查符号是否存在时,您必须在代码中明确地将其与 NULL 或 nil 进行比较。您不能使用否定运算符 (!) 来否定符号的地址。

这似乎与https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html#//apple_ref/doc/uid/TP40011210-CH4-SW22 中的“使用 nil”相矛盾

【问题讨论】:

  • 您是否尝试过否定(!)来检查符号的存在?它会抛出什么错误?
  • @RajeevRanjan 没有错误,它对我有用。因此,Apple 文档令人困惑。
  • 好的。所以它符合我的猜测。

标签: objective-c null weak-linking weak-symbol


【解决方案1】:

文档说明您不能否定该地址。换句话说,你不能这样做:

if (!MyWeakLinkedFunction) {
    // symbol doesn't exist
}

您必须改为:

if (MyWeakLinkedFunction == NULL) {
    // symbol doesn't exist
}

但是,这两种方法都有效:

if (MyWeakLinkedFunction) {
    // symbol exists
}

或:

if (MyWeakLinkedFunction != NULL) {
    // symbol exists
}

【讨论】:

  • 所以,尽管NULL 被(很可能)定义(void*) 0,但将否定运算符应用于它并不会给出评估为true 的东西?
  • @NicolasMiari 我不明白你的问题。在我的答案中,否定运算符不适用于NULL
  • 我只是假设如果MyWeakLinkedFunction == NULL 的计算结果为true,那么MyWeakLinkedFunction 实际上应该是NULL(又名0),否定它会得到true。我的意思是,仍然不清楚为什么 ! MyWeakLinkedFunction 没有意义/不允许。
  • @NicolasMiari 我不是 100% 确定,但我认为这与它是对弱链接函数的存在的运行时检查有关,因此否定不能正常工作人们可能期望使用“正常”指针。
  • 我明白了。我不知道编译时/运行时弱链接的所有实现细节,但读起来会很有趣。我会做一些研究...
【解决方案2】:

IMO,我们可能只是想多了。

在检查符号是否存在时,必须显式 将其与代码中的 NULL 或 nil 进行比较。

这部分只说 - 如果你想检查存在(而不是不存在),你必须明确比较NULLNIL

您不能使用否定运算符 (!) 来否定 符号。

如果你成功否定了符号的地址,它只是你成功地检查了不存在(而不是存在)。

当我遇到以下情况时,我认为这可能是一种可能性,因为他们使用了可用性这个词here -

注意:要检查函数的可用性,请显式比较其 地址为 NULL 或 nil。您不能使用否定运算符 ( ! ) 否定函数的地址以检查其可用性。另外,请注意 C 函数的名称与其地址是同义词。那是, &myFunction 等价于 myFunction。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2013-05-12
    相关资源
    最近更新 更多