2009-11-04 3 views
5

Ich versuche ein Array (States) von Arrays (Cities) zu erstellen. Jedes Mal, wenn ich versuche, ein Element zu meinem City-Array hinzuzufügen, erhalte ich diesen Fehler:NSMutableArray addObject, nicht erkannter Selektor

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

Mein Code ist wie folgt. Die Linie es Fehler auf

ist
[currentCities addObject:city]; 

Ich bin sicher, dass ich etwas Memory Management Problem habe, wie ich es immer noch nicht verstehen gut, dass. Hatte gehofft, dass mir jemand meinen Fehler erklären könnte.

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

Antwort

9

Die Linien:

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

Soll heißen:

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

die hoffentlich Ihr Problem beheben sollte. Anstatt Ihr Array zu initialisieren, senden Sie eine Init-Nachricht an ein Klassenobjekt, was nichts bewirkt. Danach ist der currentCities-Zeiger immer noch nicht initialisiert.

Noch besser wäre es, dass die Linie zu entfernen und die vierte Zeile so ändern, dass Sie zuweisen und initialisieren alle in einem Schritt:

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

zu ändern Wenn Sie separate Initialisierung tun (die Sie sollten nicht, aber wenn Sie das tun), es 'currentCities = lesen muss [currentCities init ] '. NSArray-Initialisierer geben den Empfänger niemals zurück, und dies wird von keinem Klasseninitialisierer garantiert. – Chuck

+0

Der Grund, warum ich die [currentCities init] habe; Zeile ist, weil es eine neue Instanz initialisieren muss, wenn wir in den nächsten Zustand wechseln. Das Ändern dieser Zeile behob dieses Problem, führte aber zu einem weiteren Problem. Durch das Hinzufügen des zweiten Schritts ([[NSMutableArray alloc] init]) wurde dieses Problem jedoch behoben. Danke. –

+0

Wenn Sie eine neue Instanz initialisieren, sollten Sie auch eine neue Instanz zuweisen. – Wevah

3

Sie müssen eine Art Initialisierer auf NSMutableArray aufrufen, nicht wahr? initWithCapacity oder etwas ähnliches? Nicht sicher, was du bekommst, wenn du es ablegst.

** Nur getestet. Machen Sie es [[NSMutableArray alloc] init] und es wird Ihnen gut gehen.

1

Es war Initialisierung Problem für mich.

Hatte von

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

zu

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