Відповіді:
nilслід використовувати лише замість того id, що ми, програмісти Java та C ++, вважали вказівником на об’єкт. Використовувати NULLдля не об’єктних покажчиків.
Подивіться на декларацію цього методу:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
Контекст - це void *(тобто вказівник у стилі С), тому ви неодмінно використовуєте NULL(який іноді оголошується як (void *)0), а не nil(який має тип id).
contextin observeValueForKeyPath:ofObject:change:context:є void *, чи не означає це, що дані, передані як дані, contextможуть бути вказівником об'єкта? Я думаю, що це звичайний випадок. Ось чому я плутаюся, чому документи завжди використовуються NULLзамість nil.
Технічно це те саме (0), але нуль зазвичай використовується для типу об'єкта Objective-C, тоді як NULL використовується для покажчиків стилю c (void *).
Технічно те саме і відрізняється лише стилем:
nil, що використовувати для idтипу (і покажчики на об’єкти).NULLсаме для цього ви використовуєте void *.0.Я зазвичай використовую варіант , який відповідає мові , де типу оголошений .
NULLце C equivalentз nil, покажчик нічого;
де nil is zero typed as id,
NULL is zero typed as void*.
Один важливий момент, коли ви не можете надіслати повідомлення NULL. Тому бажано використовувати нуль у об’єктивно-С у багатьох місцях.
Вони майже те саме, за винятком,
nilвикористовується в стилі Objective-C. де NULLпризначено для покажчиків типу С і вводиться до них (void *).