2009-11-04 5 views
5

J'essaie de créer un tableau (States) de tableaux (Cities). Chaque fois que je tente d'ajouter un élément à mon tableau Ville Je reçois cette erreur:NSMutableArray addObject, sélecteur non reconnu

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

Mon code est le suivant. La ligne est sur des erreurs it

[currentCities addObject:city]; 

Je suis sûr que j'ai un problème de gestion de la mémoire que je ne comprends toujours pas tout bien. J'espérais que quelqu'un pourrait m'expliquer mon erreur.

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

Répondre

9

Les lignes:

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

lire:

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

qui devrait, espérons résoudre votre problème. Au lieu d'initialiser votre tableau, vous envoyez un message init à un objet de classe, qui ne fait rien. Ensuite, le pointeur currentCities n'est toujours pas initialisé. Mieux encore

serait de supprimer cette ligne et changer la 4ème ligne de telle sorte que vous allouez et initialiser en une seule étape:

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

Si vous faites l'initialisation séparée (qui vous ne devriez pas, mais si vous faites), il faut lire 'currentCities = [currentCities init ] '. Les initialiseurs NSArray ne renvoient jamais le récepteur, et l'initialiseur d'aucune classe est garanti de le faire. – Chuck

+0

La raison pour laquelle j'ai le [init de currentCities]; line est parce qu'il faudra initialiser une nouvelle instance quand on passe à l'état suivant. La modification de cette ligne a résolu ce problème mais a soulevé un autre problème, mais l'ajout de la seconde étape que vous avez mentionnée ([[NSMutableArray alloc] init]) a résolu ce problème. Merci. –

+0

Si vous initialisez une nouvelle instance, vous devez également allouer une nouvelle instance. – Wevah

3

Vous devez appeler une sorte d'initialiseur sur NSMutableArray, n'est-ce pas? initWithCapacity, ou quelque chose comme ça? Je ne sais pas ce que vous obtenez si vous le laissez.

** Juste testé. Faites-le [[NSMutableArray alloc] init] et tout ira bien.

1

Il était problème d'initialisation pour moi.

à passer d'une

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

à

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