2009-05-07 3 views
40

Вот контекст, в котором я видел, что:В чем разница между [NSNull null] и nil?

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

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

+2

Не получается лучше этого ---> http://nshipster.com/nil/ –

ответ

77

Непосредственно из Apple:

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

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

10

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

8

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

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

-11

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

+9

Нет, не в этом случае. Этот ответ просто неверен. – Palimondo

6

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

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]

+2

'- [NSObject isEqual:]' является правильным и рекомендуемым методом сравнения объекта objc с NSNull. –

+0

New-alloc'd NSObjects начинает свою жизнь с установленного значения 0. Это означает, что все указатели, которые объект имеет для других объектов, начинаются как nil, поэтому нет необходимости, например, устанавливать self. (Association) = nil в методах init ,В случае 1 «a» имеет значение по умолчанию 0, которое указывает nil/Nil, и для второго случая вы назначаете singleton-объект, используемый для представления null, поэтому он выводит значение null не nil. –

Смежные вопросы