Объекты Objective-C
Прежде всего, когда вы называете это:
id someObject = [NSArray array];
someObject
не является объектом массива напрямую, а только указателем на него. Это означает, что если someObject
равно 0x1234
, то в памяти есть объект по этому адресу.
Вот причина, по которой
id someOtherObject = someObject;
не копирует объект. Оба указателя теперь указывают на один и тот же объект.
Указатель на 0x0
Итак, как определяется nil
? Давайте посмотрим на исходный код:
objc.h
#define nil __DARWIN_NULL /* id of Nil instance */
_types.h
#ifdef __cplusplus
…
#else /* ! __cplusplus */
#define __DARWIN_NULL ((void *)0)
#endif /* __cplusplus */
Похоже, nil
это указатель на адрес 0x0.
И что?
Давайте посмотрим, что может сказать Справочник по программированию Objective-C :
Отправка сообщений на ноль
В Objective-C допустимо отправлять
сообщение на ноль - оно просто не имеет никакого эффекта
во время выполнения. Есть несколько моделей
в какао, которые пользуются этим
факт. Значение, возвращаемое из
сообщение на ноль также может быть действительным:…
Возвращаемые значения: nil
, 0 или struct
со всеми переменными, инициализированными равными 0. Какая из них зависит от ожидаемого типа возвращаемого значения. Существует явная проверка во время выполнения target-c для сообщений на nil
, это означает, что это действительно быстро.
Nil
, nil
, NULL
Это 3 типа. Вот все определения:
#define Nil __DARWIN_NULL /* id of Nil class */
#define nil __DARWIN_NULL /* id of Nil instance */
#define NULL __DARWIN_NULL
#define __DARWIN_NULL ((void *)0)
Как видно, все они абсолютно одинаковы. Nil
и nil
определены Objective-C, NULL
происходит от C.
Какая тогда разница? Это только о стиле. Это делает код более читабельным.
Nil
используется как несуществующий класс: Class someClass = Nil
.
nil
используется как несуществующий экземпляр: id someInstance = nil
.
NULL
- указатель на несуществующую часть памяти: char *theString = NULL
.
Short
nil
не пустой объект, а несуществующий. Метод -getSomeObject
не возвращает пустой объект, если он не существует, но возвращает nil
, который сообщает пользователю об отсутствии объекта.
Может быть, это имеет смысл: (И то и другое скомпилируется и запустится.)
if (anObject == nil) { // One cannot compare nothing to nothing,
// that wouldn't make sense.
if (anObject) { // Correct, one checks for the existence of anObject