Подтвердить что ты не робот

Что лучше всего описывает ноль? Что это на самом деле?

В настоящее время я понимаю это как своего рода "пустой объект". Но что это на самом деле?

4b9b3361

Ответ 1

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 Ссылка на Программу должна сказать:

Отправка сообщений в nil

В Objective-C, действительно, необходимо отправить сообщение nil-it просто не имеет эффекта во время выполнения. Существует несколько шаблонов в Cocoa, которые используют это факт. Значение, возвращаемое с сообщение nil также может быть действительным:...

Возвращенными значениями являются либо nil, 0, либо struct со всеми переменными, инициализированными на 0. Какой из них зависит от ожидаемого типа возврата. Явная проверка в objective-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.

Короткие

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

Ответ 2

Это не пустой объект, это отсутствие какого-либо объекта вообще. Остальные ответы охватывают другую семантику, поэтому я оставлю это:)

Ответ 3

nil следует использовать только с указателями, а nil представляет указатель, который указывает на ничего (это значение равно нулю)

NSString *myString = nil; // myString points to nothing
int x = nil; // invalid, "x" is not a pointer, but it will compile

Ответ 4

Это "ничего". Но "ничего" вы не можете отправлять сообщения, не убивая, как если бы вы пытались вызвать метод на NULL.

Вы можете посмотреть этот вопрос, чтобы узнать больше о NULL vs. nil

Ответ 6

Формально определенный, он определяется как Joshual - указатель на ничего или указатель на какой-либо объект вообще.

С практической точки зрения реализации, особенно при работе с структурами данных и алгоритмами, ниль часто будет представлять собой дозорный элемент в структуре данных или объект, который представляет "ничего", например, в красно-черном дереве, технически, все листовые узлы "ниль", но у них все еще есть те же или подобные свойства и операции листа node (цвет, указатель на родительский элемент и т.д.) - в этих случаях это действительно "ничего" "... если это имеет смысл.

Таким образом, формально это указатель на ничего, на практике он часто рассматривается как представление ничего, но он никогда... null.

Ответ 7

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

Под "ничего не значит" я имею в виду, что любое отправленное вами сообщение не будет иметь побочных эффектов.

Он "пуст" в том смысле, что когда вы запрашиваете его для значения какого-либо свойства, он всегда возвращает nil. Поэтому он не держит никаких значений → он пуст.
(На самом деле, это немного сложнее, когда вы запрашиваете значение свойства, которое возвращает тип, который НЕ является объектом obj-c. Вы вернетесь к размеру 0 указателя. Таким образом, для любых скалярных значений, которые не больше sizeof(void*), вы получаете 0. Но если вы попросите struct или double в 32-битной системе, вы получите результат undefined. Я написал об этом here.)

Ответ 8

Возможно, мне просто не хватает очевидного, но это похоже на семантический вопрос. Как и в, вы можете использовать много разных слов для описания, но ваше описание работает уже достаточно хорошо.

http://en.wikipedia.org/wiki/Null_(computer_programming)

Ответ 9

Просто, чтобы уточнить, в Objective-C nil и null - это не одно и то же. Они также не представляют то же самое в Objective-C, как в математике или других языках программирования.

Nil на самом деле является специальным адресом памяти 0x0 (по крайней мере, компилятор рассматривает его как адрес.) Nil используется как адрес объекта, который назван, но не назначен. Это позволяет проверить наличие/распределение именованных объектов, а также обеспечить безопасный способ отправки сообщений объектам, которые могут не существовать. В то время как в математике и некоторых языках вы можете сравнить скалярные переменные с nil, в Objective-c, вы не должны. Вы должны сравнивать адрес объектов.

NULL может означать либо стандартный C, определенный как целочисленное значение NULL==0, либо он может представлять собой фактически выделенный объект класса NSNull с определенным адресом в памяти. Однако NSNull - это одноэлементный объект, т.е. Для каждого приложения существует только один. Он используется в качестве заполнителя для других объектов, обычно в коллекциях. Вы не можете использовать его в сравнении с любым другим объектом. Вы можете только проверить, указывает ли конкретный указатель на объект SingleNNNull. Однако обратите внимание, что в качестве выделенного объекта [NSNull null]!=NULL,

Путаница между nil и NULL возникает, потому что назначение адреса NULL присваивает его нулевому адресу 0x0. Такой код работает, но может иногда вызвать тонкую проблему. Лучше всего привыкнуть не смешивать двух.

Итак, в Objective-c, nil, NUll и NSNull являются тремя различными, но перекрывающимися концепциями, которые легко путать. Nil следует использовать для адресов, NULL следует использовать для скалярных значений, а NSNull следует использовать в качестве заполнителя для выделенных объектов.