2009-11-04 14 views
5

Próbuję utworzyć tablicę (Stany) tablic (miasta). Ilekroć próbuję dodać element do mojego tablicy miasta otrzymuję ten błąd:NSMutableArray addObject, nierozpoznany selektor

'NSInvalidArgumentException', reason: '*** +[NSMutableArray addObject:]: unrecognized selector sent to class 0x303097a0

Mój kod jest następujący. Linia it błędów na to

[currentCities addObject:city]; 

Jestem pewien, że mam jakiś problem zarządzania pamięcią jak ja nadal nie rozumiem, to wszystko dobrze. Miałem nadzieję, że ktoś może mi wyjaśnić mój błąd.

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]; 
     } 
    } 

Odpowiedz

9

Linie:

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

powinien brzmieć:

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

która powinna miejmy nadzieję rozwiązać problem. Zamiast inicjowania macierzy wysyłasz komunikat init do obiektu klasy, który nic nie robi. Następnie bieżący wskaźnikCities nadal nie jest inicjowany.

Jeszcze lepiej byłoby, aby usunąć tę linię i zmienić 4th linię tak, że można przydzielić i zainicjować w jednym kroku:

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

Jeśli zrobić oddzielną inicjalizacji (co nie powinno, ale jeśli robią), to musi przeczytać 'currentCities = [currentCities init, ] '. Inicjatory NSArray nigdy nie zwracają odbiornika, a inicjator klasy nie ma takiej możliwości. – Chuck

+0

Powód, dla którego mam [currentCities init]; linia jest, ponieważ będzie konieczne zainicjowanie nowej instancji po przejściu do następnego stanu. Zmiana tej linii rozwiązała ten problem, ale wywołała inny problem, jednak dodanie drugiego kroku, o którym wspomniałeś ([init NSMutableArray alloc]) rozwiązało ten problem. Dziękuję. –

+0

Jeśli zainicjujesz nową instancję, powinieneś także przydzielić nową instancję. – Wevah

3

Musisz wywołać jakiś inicjator na NSMutableArray, prawda? initWithCapacity, czy coś w tym stylu? Nie masz pewności, co otrzymasz, jeśli ją odrzucisz.

** Właśnie przetestowałem to. Ustaw go jako [[NSMutableArray alloc] init] i wszystko będzie dobrze.

1

To był błąd inicjalizacji dla mnie.

musiał zmienić z

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

do

NSMutableArray *myArray = [NSMutableArray new]; // initialized! 
Powiązane problemy