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

Какая разница между [NSNull null] и nil?

Здесь контекст, где я видел это:

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Мы все согласны с тем, что [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 == nil

2014-01-31 10: 57: 11.179 MCDocsApp [13266: a0b] a == Nil

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]

Ответ 5

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