0

Je continue à obtenir l'erreur « Mettre fin application en raison d'une exception non interceptée « NSInvalidArgumentException », raison: « + [MainViewController minimalFormInContext:]: sélecteur non reconnu envoyé à la classe » de cette ligne de code: NSLog (@ "Accès à des entités minières spécifiques");Avoir la copie de données de la difficulté à un tableau mutable

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Mine" inManagedObjectContext:managedObjectContext]; 
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
NSError *error = nil; 
[request setEntity:entity]; 
NSPredicate *predicate; 
NSPredicate *metalFilter; 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *region = [defaults stringForKey:@"mineArray"]; 

if([region isEqualToString:@"Butte & Plumas"]) 
{ 
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@) OR (county Contains %@)",@"Butte",@"Plumas"]; 
} 
else if([region isEqualToString:@"Sutter, Yuba, & Sierra"]) 
{ 
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@) OR (county Contains %@) OR (county Contains %@)",@"Sutter",@"Yuba",@"Sierra"]; 
} 
else if([region isEqualToString:@"Nevada & Placer"]) 
{ 
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@) OR (county Contains %@)",@"Nevada",@"Placer"]; 
} 
else if([region isEqualToString:@"Sacramento & El Dorado"]) 
{ 
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@) OR (county Contains %@)",@"Sacramento",@"El Dorado"]; 
} 
else if([region isEqualToString:@"San Joaquin, Amador, & Calaveras"]) 
{ 
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@) OR (county Contains %@) OR (county Contains%@)",@"San Joaquin",@"Amador", @"Calaveras"]; 
} 
else if([region isEqualToString:@"Tuolumne & Stanislaus"]) 
{ 
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@) OR (county Contains %@)",@"Tuolumne",@"Stanislaus"]; 
} 
else if([region isEqualToString:@"Merced, Mariposa, & Madera"]) 
{ 
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@) OR (county Contains %@) OR (county Contains %@)",@"Merced",@"Mariposa",@"Madera"]; 
} 

[request setPredicate:predicate]; 
mArray = [[NSMutableArray alloc] init]; 
mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 

en utilisant débogueur, j'ai rétréci l'erreur comme se produisant dans:

mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 

Comment puis-je résoudre ce problème?

Répondre

3

Il s'agit probablement d'un bogue de conservation/libération. Faites "Construire et analyser" dans XCode, et améliorez votre code pour supprimer tous les avertissements.

Voici ce que je remarquai:

mArray = [[NSMutableArray alloc] init]; 
mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 

Ces deux lignes sont très mauvais. Quel est votre mArray? Est-ce que m signifie member ou mutable? Si elle est une variable membre, vous ne devriez pas simplement attribuer un nouveau tableau que comme dans

// mArray points to an array at this time, say X 
mArray = [[NSMutableArray alloc] init]; 
// at this point, mArray points to an array Y created by alloc init. X is lost! 

De plus, si vous encore attribuer un mutableCopy comme vous l'avez fait,

mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
// at this point, mArray points to an array Z created by mutableCopy. Y is lost, too! 

Notez que dans Objective C, les variables que vous voyez sur le code source est juste un pointeur, pas l'objet lui-même. Si vous assignez quelque chose à une variable, cela ne fait pas que l'objet exécute l'opération d'assignation, mais change simplement le pointeur pour pointer vers quelque chose de différent.

Le fait que vous ayez ces lignes suggère que vous avez des choses similaires dans d'autres endroits; Tout cela peut éventuellement conduire au bug que vous rencontrez. Vous devez donc les traiter un par un. Bonne chance!

Un autre point: lorsque vous préparez la predicate variable, la chaîne de clauses if laisse predicate indéfini si correspond region aucun des choix que vous avez énumérés. Cela est très dangereux, parce que dans Objective-C, la ligne

NSPredicate* predicate; 

ne pas initialiser predicate être nil. Il est donc possible que

[request setPredicate:predicate]; 

fixeront une poubelle à l'predicate de requrest. Vous devriez le changer à

NSPredicate* predicate=nil; 
+0

Je soupçonne fortement que c'est le dernier - le sélecteur invalide énuméré est une méthode de NSPredicate. Donc, probablement, la variable qu'il pense pointer vers un NSPredicate pointe en fait vers un emplacement de mémoire aléatoire. – Chuck

+0

mon mArray est synonyme de mineArray. Ce que j'essaie de faire est de créer un tableau d'entités à utiliser temporairement dans le programme; existe-t-il un meilleur moyen de placer des données dans un tableau à partir d'une requête de récupération? J'ai édité les prédicats pour égaler zéro avant qu'ils ne soient utilisés. –

+0

et il semble que les mettre à zéro est un non-non, donc je les ai juste mis à égalité avec un autre prédicat. –