NSMutableArray addObject, непризнанный селектор

Я пытаюсь создать массив (состояния) массивов (городов). Всякий раз, когда я пытаюсь добавить элемент в свой массив City, я получаю эту ошибку:

'NSInvalidArgumentException', причина: '*** + [NSMutableArray addObject:]: непризнанный селектор, отправленный в класс 0x303097a0

Мой код выглядит следующим образом. Строка, на которой он совершает ошибки, -

[currentCities addObject:city];

Я уверен, что у меня проблема с управлением памятью, поскольку я все еще не понимаю все это. Я надеялся, что кто-то сможет объяснить мне мою ошибку.

if (sqlite3_prepare_v2(db, sql, -1, &statement, NULL) == SQLITE_OK){
 // We need to keep track of the state we are on
 NSString *state = @"none";
 NSMutableArray *currentCities = [NSMutableArray alloc];
 // We "step" through the results - once for each row
 while (sqlite3_step(statement) == SQLITE_ROW){
 // The second parameter indicates the column index into the result set.
 int primaryKey = sqlite3_column_int(statement, 0);
 City *city = [[City alloc] initWithPrimaryKey:primaryKey database:db];
 if (![state isEqualToString:city.state])
 {
 // We switched states
 state = [[NSString alloc] initWithString:city.state]; 
 // Add the old array to the states array
 [self.states addObject:currentCities];
 // set up a new cities array
 currentCities = [NSMutableArray init];
 }
 [currentCities addObject:city];
 [city release];
 }
 }
3 ответа

Строки:

// set up a new cities array
currentCities = [NSMutableArray init];

Должно читать:

// set up a new cities array
[currentCities init];

который, надеюсь, исправит вашу проблему. Вместо инициализации массива вы отправляете сообщение init объекту класса, который ничего не делает. Впоследствии вы указатель currentCities все еще не инициализированы.

Еще лучше было бы удалить эту строку и изменить 4-ю строку так, чтобы вы выделили и инициализировали все за один шаг:

NSMutableArray *currentCities = [[NSMutableArray alloc] init];


Вам нужно вызвать какой-то инициализатор в NSMutableArray, не так ли? initWithCapacity, или что-то в этом роде? Не уверен, что вы получите, если не оставите это.

** Просто протестировал его. Сделайте это [[NSMutableArray alloc] init], и все будет в порядке.


Это была проблема инициализации для меня.

Пришлось менять

NSMutableArray *myArray = [NSMutableArray mutableCopy]; // not initialized. don't know why this even compiles
[myArray addObject:someObject]; // crashed

to

NSMutableArray *myArray = [NSMutableArray new]; // initialized!

licensed under cc by-sa 3.0 with attribution.