NSMutableArray addObject, sélecteur non reconnu
-
16-09-2019 - |
Question
Je suis en train de créer un tableau (États) de tableaux (villes). Chaque fois que je tente d'ajouter un élément à mon tableau de la ville, je reçois cette erreur:
'NSInvalidArgumentException', raison: « *** + [NSMutableArray addObject]: sélecteur non reconnu envoyé à la classe 0x303097a0
Mon code est le suivant. Les erreurs ligne de it sur est
[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. Espérais que quelqu'un pourrait expliquer mon erreur à moi.
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];
}
}
La solution
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 d'initialisation à un objet de classe, ce qui ne fait rien. Ensuite, vous êtes pointeur de currentCities est toujours pas initialisé.
Encore mieux 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];
Autres conseils
Vous devez appeler une sorte de initialiseur sur NSMutableArray, non? initWithCapacity, ou quelque chose comme ça? Je ne sais pas ce que vous obtenez si vous le laissez au large.
** Juste testé. Rendre [[NSMutableArray alloc] init] et vous serez très bien.
Il était problème d'initialisation pour moi.
Nous avons dû changer de
NSMutableArray *myArray = [NSMutableArray mutableCopy]; // not initialized. don't know why this even compiles
[myArray addObject:someObject]; // crashed
à
NSMutableArray *myArray = [NSMutableArray new]; // initialized!