2016-01-06 8 views
4

Ответы на это question указывают, что if (x != nil) - это то же самое, что и if (x).Почему мы не можем использовать оператор отрицания при проверке наличия символа?

Apple documentation Но гласит:

Примечание: При проверке существования символа, вы должны явно сравнить это значение NULL или ноль в коде. Вы не можете использовать оператор отрицания (!), Чтобы отрицать адрес символа.

Что, кажется, противоречит «Работа с нуля» от https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html#//apple_ref/doc/uid/TP40011210-CH4-SW22

+0

Вы пробовали отрицание (!) Когда-либо, чтобы проверить наличие символа? Какую ошибку он бросает? –

+0

@ RajeevRanjan нет ошибки, он работает для меня. Поэтому документация Apple запутанна. –

+0

Хорошо. так что это было так, как я размышлял. –

ответ

3

Документация о том, что вы не можете отрицать адрес. Другими словами, вы не можете сделать это:

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

Вместо этого вы должны сделать:

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

Однако обе эти работы:

if (MyWeakLinkedFunction) { 
    // symbol exists 
} 

или:

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

Итак, несмотря на то, что 'NULL' является (скорее всего) _defined_ as' (void *) 0', применяя к нему оператор отрицания, не дает то, что оценивает 'true'? –

+0

@NicolasMiari Я не понимаю ваш вопрос. Оператор отрицания не применяется к «NULL» в любом месте моего ответа. – rmaddy

+1

Я просто предположил, что если 'MyWeakLinkedFunction == NULL' оценивается как' true', тогда 'MyWeakLinkedFunction' должен быть фактически' NULL' (a.k.a. '0') и отрицать, что дало бы' true'. Я имею в виду, что до сих пор неясно ** почему ** '! MyWeakLinkedFunction' не имеет смысла/допускается. –

1

ИМО, мы могли бы просто переоценить.

При проверке наличия символа вы должны явно указать сравнить его с NULL или нулем в коде.

Эта часть говорит только - Если вы хотите проверить существование (а не небытие), вы должны явно сравнить NULL или NIL

Вы не можете использовать оператор отрицания (!), чтобы свести на нет адрес символ.

Если вам удастся отрицать адрес символа, его единственное, что вы успешно завершаете проверку небытия (а не существования).

Когда я наткнулся на следующем, я думал, что это может быть возможностью, поскольку они используют свободные номера слова here -

Примечание: Для того, чтобы проверить наличие функции, явно сравнить его адреса в NULL или ноль. Вы не можете использовать оператор отрицания (!) До , чтобы исключить адрес функции, чтобы проверить ее доступность. Также отметьте , что имя функции C является синонимом его адреса. То есть, & myFunction эквивалентен myFunction.