Почему nilObject isEqual nilObject возвращает нет? - PullRequest
2 голосов
/ 07 марта 2012

Когда я использую этот код:

    NSString *a = nil;
    NSString *b = nil;
    if([a isEqual:b]){
        NSLog(@"YES");
    }
    else{
        NSLog(@"NO");
    }

На консоли выдается «НЕТ». Я не понимаю этого поведения.Не могли бы вы объяснить мне?

Ответы [ 3 ]

4 голосов
/ 07 марта 2012

См. Отправка сообщений на ноль в Язык программирования Objective-C . Когда вы отправляете сообщение объекту nil и метод возвращает объект, выражение оценивается как nil, что эквивалентно 0, что эквивалентно NO.

4 голосов
/ 07 марта 2012

Правила отправки сообщений на nil следующие:

(Источник: https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocObjectsClasses.html#//apple_ref/doc/uid/TP30001163-CH11-SW7)

  • Если метод возвращает любой тип указателя, любой целочисленный скаляр размераменьше или равно sizeof(void*), float, double, long double или long long, то сообщение, отправленное на nil, возвращает 0.
  • Еслиметод возвращает struct, как определено в Руководстве по вызову функции Mac OS X ABI , которое должно быть возвращено в регистрах, затем сообщение, отправленное на nil, возвращает 0.0 для каждого поля в struct. Другие struct типы данных не будут заполнены нулями.
  • Если метод возвращает что-либо кроме вышеупомянутых типов значений, возвращаемое значение сообщения, отправленного на nil, не определено.

(Спасибо @ Джим )

Так, например, если вы сделаете это:

if(![nil someMessageThatAlwaysReturnsTrue]) {
   NSLog(@"Watch this.");
}

Он будет печатать "Watch this" каждыевремя.

1 голос
/ 07 марта 2012

Что означает [a isEqual:b] на самом деле?

Это значит, отправить сообщение isEqual с параметром b объекту a.

и отправить любоесообщение объекту nil возвращает nil.Что неверно (НЕТ).

...