it-swarm.com.ru

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

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

179
erikprice

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).

225
Paul Tomblin

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

64
Marc Charbonneau

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

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

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

52
Andrew

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

где nil is zero typed as id,

NULL is zero typed as void*.

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

12
user2560622

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

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

3
dan14941