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


182

В observeValueForKeyPath:ofObject:change:context:- почему документы используют NULLвместо 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 *(то есть указателем в стиле C), поэтому вы определенно должны использовать NULL(который иногда объявляется как (void *)0), а не nil(который имеет тип id).


2
Но так как тип contextin observeValueForKeyPath:ofObject:change:context:is void *, не означает ли это, что данные, передаваемые как, contextмогут быть указателем на объект? Я думаю, что это частый случай. Вот почему я не понимаю, почему документы всегда используют NULLвместо nil.
erikprice

2
Тип контекста: в этом методе "void *". «nil» - это не «void *», но NULL.
Пол Томблин

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

3
Они сказали, что void *. NULL для void *, а nil для id. Следовательно, вы передаете NULL. Если вы передадите ноль, вы врете своему читателю, который подумает, что этот метод использует идентификатор.
Питер Хоси

12
Или, если подумать, NULL - это более широкий тип, а nil - это подмножество NULL. В общем, используйте самый широкий тип, с которым вы можете обойтись (то есть в Java, напишите свой метод, чтобы ожидать коллекцию вместо вектора, если вам не нужно что-то конкретное от вектора)
Пол Томблин

65

Технически это одно и то же (0), но nil обычно используется для типа объекта Objective-C, а NULL используется для указателей в стиле c (void *).


8
Кроме того, NULLопределяется по-другому, чем nil. nilопределяется как (id)0. NULLнет.

14
@WTP, если вы читаете MacTypes.h, он объявляет #define nil NULL
jbat100

1
Это очень интересно. Кажется, это не имеет значения, кроме как для стилевых очков. Это как ДА / ИСТИНА и НЕТ / ЛОЖЬ.
Бреннан

1
@Brennan, это не совсем так, просто потому, что nil определен как NULL, не означает, что есть какая-то другая скрытая реализация за кулисами. Например, IBAction определен как void, но он имеет другое значение при использовании конструктора интерфейса при отображении методов для присоединения к действиям на кнопках и тому подобном.
Михей Уоллес

53

Технически они одно и то же и отличаются только стилем:

  • Стиль Objective-C говорит nil, что использовать дляid типа (и указатели на объекты).
  • С стиль говорит, что NULLэто то, что вы используете дляvoid * .
  • Стиль C ++ обычно говорит, что вы должны просто использовать 0.

Я обычно использую вариант, который соответствует языку, на котором объявлен тип .


14

NULLэто C equivalentиз nil, указатель ничего;

где nil is zero typed as id,

NULL is zero typed as void*,

Один важный момент: вы не можете отправить сообщение в NULL. Поэтому предпочтительно использовать nil в target-C во многих местах.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.