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

182

В observeValueForKeyPath:ofObject:change:context:- почему документы используют NULLвместо nilуказания контекста?

erikprice
источник
по моему мнению, объект - ноль, класс - ноль, и 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 во многих местах.


источник
4

Они почти одно и то же, кроме

nilиспользуется в стиле Objective-C. где NULLдля указателей типа C и для typedef'ed (void *).

dan14941
источник
1
Разве это не в значительной степени повторение этого существующего ответа ?
Панг