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