2009-11-04 20 views
5

Sto provando a creare un array (Stati) di array (città). Ogni volta che provo ad aggiungere un elemento al mio Array Città ottengo questo errore:NSMutableArray addObject, selettore non riconosciuto

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

Il mio codice è il seguente. La linea E gli errori sul è

[currentCities addObject:city]; 

Sono sicuro che ho avuto qualche problema di gestione della memoria come io ancora non lo capisco tanto bene. Speravo che qualcuno potesse spiegarmi il mio errore.

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

risposta

9

Le linee:

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

il termine è:

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

che dovrebbe auspicabilmente risolvere il problema. Invece di inizializzare l'array, stai inviando un messaggio di init a un oggetto di classe, che non fa nulla. Successivamente, il puntatore currentCities non è ancora inizializzato.

Ancora meglio sarebbe per rimuovere quella linea e cambiare la linea 4 in modo tale che si alloca e inizializzare il tutto in un solo passo:

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

Se fare l'inizio separato (che non si dovrebbe, ma se si fa), è necessario leggere 'currentCities = [currentCities init ] '. Gli inizializzatori NSArray non restituiscono mai il ricevitore e non è garantito l'inizializzatore di classe. – Chuck

+0

Il motivo per cui ho l'init [currentCities]; la linea è perché sarà necessario inizializzare una nuova istanza quando passeremo allo stato successivo. La modifica di tale riga ha risolto il problema, ma ha sollevato un altro problema, tuttavia l'aggiunta del secondo passaggio da lei menzionato ([[NSMutableArray alloc] init]) ha risolto il problema. Grazie. –

+0

Se si inizializza una nuova istanza, si dovrebbe assegnare anche una nuova istanza. – Wevah

3

È necessario chiamare una sorta di inizializzatore su NSMutableArray, non è vero? initWithCapacity, o qualcosa del genere? Non sei sicuro di ciò che ottieni se lo lasci fuori.

** Appena testato. Rendilo [[NSMutableArray alloc] init] e starai bene.

1

Era problema di inizializzazione per me.

ha dovuto cambiare da

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

a

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