Все три из этих значений представляют значения с нулевым или нулевым указателем. разница в том, что, хотя NULL представляет нуль для любого указателя, nil is специфичный для объектов (например, id), а Nil - для указателей классов. В качестве наилучшей практики следует использовать правильный нулевой объект в правильных обстоятельствах для целей документации, даже хотя ничто не мешает кому-то смешивать и сопоставлять они идут вместе.
nil - это буквальное значение null для объектов Objective-C, соответствующее идентификатору абстрактного типа или любому типу Objective-C, объявленному через @interface. Например:
NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;
if (anotherObject == nil) // do something
Nil - это буквальное значение null для классов Objective-C, соответствующее типу Class. Поскольку большинству кода не нужны переменные для ссылочных классов, его использование не является обычным явлением. Например:
Class someClass = Nil;
Class anotherClass = [NSString class];