NULL проти нуля в Objective-C


182

В observeValueForKeyPath:ofObject:change:context:- чому документи використовують NULLзамість того, nilколи не вказують контекстний покажчик?


на мій погляд, об’єкт є нуль, клас - це Nil, а NULL використовується для об'єкта чи класу
Thanh Vũ Trần

Відповіді:


227

nilслід використовувати лише замість того id, що ми, програмісти Java та C ++, вважали вказівником на об’єкт. Використовувати NULLдля не об’єктних покажчиків.

Подивіться на декларацію цього методу:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void *)context

Контекст - це void *(тобто вказівник у стилі С), тому ви неодмінно використовуєте NULL(який іноді оголошується як (void *)0), а не nil(який має тип id).


2
Але оскільки тип contextin observeValueForKeyPath:ofObject:change:context:є void *, чи не означає це, що дані, передані як дані, contextможуть бути вказівником об'єкта? Я думаю, що це звичайний випадок. Ось чому я плутаюся, чому документи завжди використовуються NULLзамість nil.
erikprice

2
Тип контексту: у цьому методі є "void *". "нуль" не є "пустотою *", але NULL є.
Пол Томблін

3
Ти можеш. void * - будь-який вказівник. Тим не менш, ви абсолютно праві, що NULL - це правильна константа там.
Пітер Хосей

3
Вони сказали недійсним *. NULL - недійсна *, а nil - для ідентифікатора. Тому ви проходите NULL. Якщо ви пройдете нуль, ви брешете своєму читачеві, який подумає, що цей метод бере ідентифікатор.
Пітер Хосей

12
Або думати про це по-іншому, NULL - це більш широкий тип, а nil - це підмножина NULL. Загалом, використовуйте найширший тип, від якого ви можете піти (наприклад, на Java, напишіть свій метод, щоб очікувати на колекцію замість вектора, якщо вам не потрібно щось конкретно від Vector)
Пол Томблін,

65

Технічно це те саме (0), але нуль зазвичай використовується для типу об'єкта Objective-C, тоді як NULL використовується для покажчиків стилю c (void *).


8
Крім того, NULLвизначається інакше, ніж nil. nilвизначається як (id)0. NULLні.

14
@WTP, якщо ви читаєте через MacTypes.h, він оголошує #define nil NULL
jbat100

1
Це дуже цікаво. Здається, це не має іншого значення, ніж для стильових точок. Це як ТАК / ПРАВДА та НІ / ЛАЖ.
Бренан

1
@Brennan, це не зовсім так, тому що нуль визначено як NULL, це не означає, що за кадром є якась інша прихована реалізація. Наприклад, IBAction визначається як недійсний, але він має інше значення при використанні конструктора інтерфейсів під час відображення методів приєднання до дій на кнопках тощо.
Міхей Уоллес

53

Технічно те саме і відрізняється лише стилем:

  • Стиль Objective-C говорить nil, що використовувати для idтипу (і покажчики на об’єкти).
  • C стиль говорить, що NULLсаме для цього ви використовуєте void *.
  • Стиль C ++, як правило, говорить про те, що слід просто використовувати 0.

Я зазвичай використовую варіант , який відповідає мові , де типу оголошений .


14

NULLце C equivalentз nil, покажчик нічого;

де nil is zero typed as id,

NULL is zero typed as void*.

Один важливий момент, коли ви не можете надіслати повідомлення NULL. Тому бажано використовувати нуль у об’єктивно-С у багатьох місцях.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.