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

Я не забочусь слишком много о hotplugability модулей OSGi (по крайней мере, в настоящее время). Это - больше вынужденный модульный принцип. Не имение в наличии миллионов "общедоступных" классов на пути к классу в любое время защищает хорошо от круговых зависимостей: необходимо действительно думать об открытых интерфейсах - не только с точки зрения "общественности" конструкции языка Java, но и с точки зрения библиотеки/модуля: Каковы (точно) компоненты, которые Вы хотите сделать доступным для других? Каковы (точно) интерфейсы (других модулей), действительно необходимо ли реализовать функциональность?

Это хорошо, та замена в горячем режиме идет с ним, но я перезапустил бы свои обычные приложения, чем тестирующий все комбинации hotplugability...

13
задан Josh Lee 5 December 2009 в 21:36
поделиться

9 ответов

Объекты 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. сообщение до нуля - это просто не действует во время выполнения. Есть несколько шаблонов в Какао, которые используют это факт. Значение, возвращаемое из сообщение с нулевым значением также может быть допустимым:…

Возвращаемые значения - либо nil , либо структура со всеми переменными, инициализированными в 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 .

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
33
ответ дан 1 December 2019 в 17:23
поделиться

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

14
ответ дан 1 December 2019 в 17:23
поделиться

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

NSString *myString = nil; // myString points to nothing
int x = nil; // invalid, "x" is not a pointer, but it will compile
7
ответ дан 1 December 2019 в 17:23
поделиться

Это нулевой указатель - указатель на «ничего».

3
ответ дан 1 December 2019 в 17:23
поделиться

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

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

3
ответ дан 1 December 2019 в 17:23
поделиться

Formally defined, it is as Joshual defined - a pointer to nothing or a pointer to no object at all.

From a practical, implementation perspective, particularly when dealing with data structures and algorithms, a nill often will represent a sentinel in a data structure or an object that represents "nothing" for example, in a red-black tree, technically, all of the leaf nodes are "nill", but they still have the same or similar properties & operations of a leaf node (color, pointer to a parent, etc.) - in those cases, it is really a "nothing object" ... if that makes any sense.

So, formally, it is a pointer to nothing, in practice, it is often treated as a representation of nothing, but it is never ... null.

1
ответ дан 1 December 2019 в 17:23
поделиться

Один из полезных способов думать о nil - это представить, что это пустой объект, который «ничего не делает».

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

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

1
ответ дан 1 December 2019 в 17:23
поделиться

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

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

0
ответ дан 1 December 2019 в 17:23
поделиться

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

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

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

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

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

NULL следует использовать для скалярных значений, а NSNull следует использовать в качестве заполнителя для выделенных объектов.

NULL следует использовать для скалярных значений, а NSNull следует использовать в качестве заполнителя для выделенных объектов.

-2
ответ дан 1 December 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: