C ничего не представляет как 0 для примитивных значений и NULL для указателей (что эквивалентно 0 в контексте указателя).
Objective-C основан на представлении C ничего, добавляя ноль. nil - это указатель на объект. Хотя они семантически отличаются от NULL, они технически эквивалентны друг другу.
Вновь выделенные NSObjects начинают жизнь с их содержимым, установленным в 0. Это означает, что все указатели, которые объект имеет на другие объекты, начинаются как nil, поэтому нет необходимости, например, устанавливать self. (Association) = nil in методы init.
Самым заметным поведением nil является то, что ему могут отправляться сообщения.
В других языках, таких как C ++ (или Java), это может привести к сбою вашей программы, но в Objective-C вызов метода для nil возвращает нулевое значение. Это значительно упрощает выражения, поскольку устраняет необходимость проверять nil перед тем, как что-либо делать:
// For example, this expression...
if (name != nil && [name isEqualToString:@"Steve"]) { ... }
// ...can be simplified to:
if ([name isEqualToString:@"Steve"]) { ... }
Знание того, как работает nil в Objective-C, позволяет использовать это удобство, а не скрытую ошибку в вашем приложении. Обязательно защитите от случаев, когда значения nil являются нежелательными, либо проверяя и возвращая рано, чтобы завершиться с ошибкой, либо добавляя NSParameterAssert, чтобы вызвать исключение.
Источник:
http://nshipster.com/nil/
https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocObjectsClasses.html (отправка сообщения на ноль).