2009-11-04 4 views
5

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

'NSInvalidArgumentException', reason: '*** +[NSMutableArray addObject:]: unrecognized selector sent to class 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]; 
     } 
    } 

ответ

9

линии:

// 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]; 
+0

Если вы делаете отдельную инициализацию (которые вы не должны, но если вы делаете), то необходимо прочитать 'currentCities = [currentCities инициализации ] '. Инициализаторы NSArray никогда не возвращают получателя, и инициализатор класса не гарантирует этого. – Chuck

+0

Причина, по которой у меня есть [currentCities init]; потому что ему нужно будет инициализировать новый экземпляр, когда мы перейдем к следующему состоянию. Изменение этой строки устранило эту проблему, но подняло другую проблему, однако добавив второй шаг, который вы упомянули ([[NSMutableArray alloc] init]) исправил эту проблему. Спасибо. –

+0

Если вы инициализируете новый экземпляр, вам следует также назначить новый экземпляр. – Wevah

3

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

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

1

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

Если бы перейти от

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

в

NSMutableArray *myArray = [NSMutableArray new]; // initialized! 
Смежные вопросы