0

我一直收到错误“终止应用程序,由于未捕获的异常'NSInvalidArgumentException',原因:'+ [MainViewController minimalFormInContext:]:无法识别的选择器从这行代码发送到类” : 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]; 

我该如何解决这个问题?

回答

3

这可能是一个保留/发布错误。在XCode中执行“构建和分析”,并改进代码以删除所有警告。

这里有事情,我注意到:

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

这两条线都非常糟糕。你的mArray是什么? m代表membermutable?如果它是一个成员变量,你不应该只是分配一个新的数组,作为在

// 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,你在源代码中看到的变量只是一个指针,而不是对象本身。如果你给变量赋值,它不会使对象执行赋值操作,但它只是改变指针指向不同的东西。

事实上,你有这些线表明你在其他地方有类似的事情;它们中的任何一个最终都会导致你遇到的错误。所以你需要一一处理它们。祝你好运!

还有一点:当你准备变量predicateif条款链叶predicate如果region匹配没有你列出的选择的不确定。这是非常危险的,因为在Objective-C,该行

NSPredicate* predicate; 

初始化predicatenil。所以它可能是

[request setPredicate:predicate]; 

将设置一个垃圾的requrestpredicate。您应该将其更改为

NSPredicate* predicate=nil; 
+0

我强烈怀疑它是后者 - 列出的无效选择器是NSPredicate方法。因此,他认为指向NSPredicate的变量实际上可能指向随机存储位置。 – Chuck 2010-09-06 00:05:22

+0

我的mArray代表mineArray。我试图做的是创建一个临时用于程序的实体数组;有没有更好的方法将数据从提取请求放入数组中?在使用谓词之前,我编辑了谓词等于零。 – 2010-09-06 00:43:44

+0

,并且似乎将它们设置为nil是否定的,所以我只是将它们设置为等于其他谓词。 – 2010-09-06 00:58:32