0

このコード行から、「キャッチされない例外'NSInvalidArgumentException'、理由:'+ [MainViewController minimumFormInContext:]:認識されないセレクターがクラスに送信されました」というエラーが発生し続けます:NSLog(@ "特定の鉱山エンティティにアクセスしています");

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

デバッガーを使用して、次の場所で発生するエラーを絞り込みました。

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

これを修正するにはどうすればよいですか?

4

1 に答える 1

3

保持/リリースのバグである可能性があります。XCodeで「ビルドと分析」を実行し、コードを改善してすべての警告を削除します。

これが私が気づいたことです:

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

これらの2つの線は非常に悪いです。あなたは何mArrayですか?mの略ですかmember、または?mutableメンバー変数の場合は、次のように新しい配列を割り当てるだけではいけません。

// 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! 

さらに、あなたがしたようにさらにを割り当てるmutableCopyと、

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

Objective-Cでは、ソースコードに表示される変数は単なるポインタであり、オブジェクト自体ではないことに注意してください。変数に何かを割り当てる場合、オブジェクトに割り当て操作を実行させることはありませんが、別の何かを指すようにポインターを変更するだけです。

あなたがこれらの線を持っているという事実は、あなたが他の様々な場所で同様のものを持っていることを示唆しています。それのいずれかが最終的にあなたが遭遇しているバグにつながる可能性があります。だからあなたはそれらに一つずつ対処する必要があります。幸運を!

もう1つのポイント:変数を準備するとき、リストした選択肢のいずれにも一致しない場合、句predicateのチェーンは未定義のままになります。これは非常に危険です。Objective-Cでは、ifpredicateregion

 NSPredicate* predicate;

に初期化されませ。だからそれは可能ですpredicatenil

[request setPredicate:predicate];

predicateのにゴミを設定しrequrestます。次のように変更する必要があります

 NSPredicate* predicate=nil;
于 2010-09-05T23:04:39.720 に答える