В чем разница между [NSNull null] и ноль? - PullRequest
46 голосов
/ 07 мая 2009

Вот контекст, в котором я видел это:

NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++) {
    [controllers addObject:[NSNull null]];
}

почему бы не ноль в этом месте?

Ответы [ 6 ]

81 голосов
/ 07 мая 2009

Прямо от Apple :

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

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

11 голосов
/ 07 мая 2009

Нельзя добавить значение nil к NSArray или NSMutableArray. Если вам нужно сохранить значение nil, вам нужно использовать класс-оболочку NSNull, как показано в этом фрагменте. Это указано в документации .

9 голосов
/ 03 июля 2010

Классы коллекций, такие как NSArray и NSDictionary, не могут содержать nil значений. NSNULL был создан специально как заполнитель для nil. Он может быть помещен в классы коллекции и занимает только место.

NSNull определяет одноэлементный объект, что означает, что существует только один экземпляр NSNull (который вы создаете с помощью [NSNull null]), но его можно использовать в любом количестве мест.

8 голосов
/ 31 января 2014

Мы все согласны с тем, что [NSNull null] полезен в качестве заполнителя, где требуется объект, как описано выше. Но если он явно не используется в присваивании для вашего объекта, его не следует использовать для сравнения, ошибку, которую я допустил в прошлом.

id a;
NSLog(@"Case 1");
if (a == nil) NSLog(@"a == nil");
if (a == Nil) NSLog(@"a == Nil");
if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]");

NSLog(@"Case 2");
a = [NSNull null];
if (a == nil) NSLog(@"a == nil");
if (a == Nil) NSLog(@"a == Nil");
if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]");

Выход:

2014-01-31 10: 57: 11.179 MCDocsApp [13266: a0b] Дело 1

2014-01-31 10: 57: 11.179 MCDocsApp [13266: a0b] a == ноль

2014-01-31 10: 57: 11.179 MCDocsApp [13266: a0b] a == Ноль

2014-01-31 10: 57: 11.180 MCDocsApp [13266: a0b] Дело 2

2014-01-31 10: 57: 11.180 MCDocsApp [13266: a0b] a isEqual: [NSNull null]

0 голосов
/ 15 марта 2018

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

Вы не можете добавить значение nil к NSArray или NSMutableArray. Если вам нужно сохранить значение nil, вам нужно использовать класс-оболочку NSNull.

Классы коллекций, такие как NSArray и NSDictionary, не могут содержать значения nil. NSNULL был создан специально как заполнитель для nil. Он может быть помещен в классы коллекции и занимает только место.

См. Ссылку для справки

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html

0 голосов
/ 12 августа 2010

ноль отмечает конец массива после массива объектов ...

...