2010-01-13 2 views
50
NSArray *array = [[NSArray alloc] initWithObjects:@"ΕΛΤΑ", 
         @"ΕΛΤΑ COURIER", @"ACS", @"ACS ΕΞΩΤΕΡΙΚΟ", 
         @"DHL", @"INTERATTICA", @"SPEEDEX", 
         @"UPS", @"ΓΕΝΙΚΗ ΤΑΧΥΔΡΟΜΙΚΗ", @"ΜΕΤΑΦΟΡΙΚΕΣ ΕΞΩΤΕΡΙΚΟΥ", nil]; 

Это работает, потому что у него есть ноль в конце.Как добавить nil в nsmutablearray?

Но я добавлять объекты, как это: addObject:name и т.д ... Таким образом, в конце концов, я должен добавить ноль я делаю это addObhect: ноль, но когда я запустить приложение все еще падает на cellForRowAtIndexPath:

как я могу делать эту работу?

Хорошо, я не должен добавить ноль

Что является причиной того, что мое приложение падает тогда?

+1

Поскольку ваше приложение, по-видимому, сбой при заполнении UITableView, возможно, вам следует поделиться кодом для вашей реализации cellForRowAtIndexPath. Также поможет дополнительная информация о «сбое» в получении. Это SIG_ABORT или EXEC_BAD_ACCESS, и есть ли исключение (проверьте консоль Shift + Apple + R в XCode). –

+1

Когда вы добавляете их «по одному», вам ** не нужно добавлять нуль в конец **. Подумайте, если это так, если это поможет: когда вы добавляете gthem «по одному», тогда nil «уже существует», система позаботится об этом. – Fattie

+1

Я не могу не чувствовать, что ответы mr-sk, mike-weller и akosma должны быть объединены в «правильный» ответ. – llaughlin

ответ

17

Вы не можете добавить nil, когда звоните addObject.

26

Вам не нужно звонить [addObject:nil]

nil в initWithObjects: только там сказать метод, где список заканчивается, потому что, как C varargs работы. Когда вы добавляете объекты поочередно с addObject:, вам не нужно добавлять нуль.

+7

Кроме того, ноль называется «дозорным», потому что он «охраняет» конец списка, чтобы вещи не отступали от конца. Стоит знать, что это называется часовым, потому что вы можете увидеть ошибку/предупреждение компилятора, например «Отсутствующее значение дозорного ...». В этом случае это означает, что вы забыли нуль в конце чего-то, как правило, список после initWithObjects. – Nimrod

+0

Итак, в основном, если вы добавляете метод '' 'addObjects'' в NSMutableArray, вам не нужно добавлять' '' nil''' в конец? Он просто знает, когда он достигает самого конца? – Supertecnoboff

5

nil не является объектом, который можно добавить в массив: массив не может содержать nil. Вот почему addObject:nil падает.

6

ноль используется для завершения массива

0

Вы не можете добавить объект к NSArray потому, что класс является неизменяемым. Вы должны использовать NSMutableArray, если хотите изменить массив после его создания.

227

Если необходимо добавить nil объект в коллекции, используйте NSNull класс:

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

Предполагая, "массив" имеет тип NSMutableArray:

.... 
[array addObject:[NSNumber numberWithInt:2]; 
[array addObject:@"string"]; 
[array addObject:[NSNull null]]; 
+2

для новых людей (меня), пример теста, чтобы увидеть, равен ли элемент массива вставленному значению nil, if ([self.voice objectAtIndex: indexPath.row]! = [NSNull null]) {'(спасибо akosma) – tmr

15

Если вы действительно хотите Null-иш элемент в вашей коллекции, NSNull есть для этого.

6

Вам нужно добавить NSNull класс и лучший способ сделать это так:

NSArray *array = @[ @"string", @42, [NSNull null] ]; 

Я лично рекомендую использовать конкретное значение, как 0 вместо нулевой или ноль в дизайне вашего кода, но иногда вам нужно добавить null.

Существует хорошее объяснение от this Apple reference.

0

Пройдите свой объект с помощью этого метода при добавлении в массив, чтобы избежать попытки вставить нулевой объект из объектов сбоев.

-(id) returnNullIfNil:(id) obj { 
    return (obj == nil) ? ([NSNull null]) : (obj); 
} 

[NSNull null] возвращает нулевой объект, который представляет собой nil.

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