4

The answers to this question state that if (x != nil) is the same as if (x).

But Apple documentation reads:

Note: When checking for the existence of a symbol, you must explicitly compare it to NULL or nil in your code. You cannot use the negation operator ( ! ) to negate the address of the symbol.

Which seems to contradict "Working with nil" from https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html#//apple_ref/doc/uid/TP40011210-CH4-SW22

4

2 回答 2

3

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

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

您必须改为:

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

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

if (MyWeakLinkedFunction) {
    // symbol exists
}

或者:

if (MyWeakLinkedFunction != NULL) {
    // symbol exists
}
于 2016-01-06T05:48:31.347 回答
1

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

在检查符号是否存在时,您必须在代码中明确地将其与 NULL 或 nil 进行比较。

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

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

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

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

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

于 2017-10-01T14:31:19.623 回答