2010-08-27 52 views
0

實現爲在我的管理對象實體的一個類別一個類的方法,帶着一幫其他的操作如下:核心數據 - 訪問對象返回從取EXC_BAD_ACCESS

+ (NSArray*)newArrayOfAllOtherBibs 
{ 
    NSManagedObjectContext* moc = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];  
    NSString* entityName = NSStringFromClass([self class]); 

    NSEntityDescription* entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:moc]; 
    [fetchRequest setEntity:entity]; 

    NSError* error; 
    NSArray* items = [moc executeFetchRequest:fetchRequest error:&error]; 
    [fetchRequest release]; 

    NSMutableArray* bibArray = [NSMutableArray array]; 

    for(int i = 0; i < [items count]; i++) 
    { 
    Person* person = [items objectAtIndex:i]; 

    if(![person.isSelf isEqualToString:@"YES"]) 
    { 
// crash here! 
     if([person.bib length] > 0) 
// crash here! 
     [bibArray addObject:person.bib]; 
    } 
    } 
    return [bibArray retain]; 
} 

所以它應該是查看Person的所有實體,返回一個非常簡單的提取,並將所有未標記爲「self」(屬性isSelf,類型NSString)的所有實體添加到返回給調用者的新數組中。所有其他添加/刪除/查找匹配的方法都運行良好。

使用

NSString* entityName = NSStringFromClass([self class]); 

是企圖使功能更加通用的,所以我可以削減&以弱編輯需要粘貼這些功能的其他實體。

人看起來是這樣的:

@interface Person : NSManagedObject 
    { 
    } 

    @property (nonatomic, retain) NSString * bib; 
    @property (nonatomic, retain) NSString * isSelf; 
[...]  
    @end 

的問題是,有什麼事情就行了解釋EXC_BAD_ACCESS標記?分析儀沒有顯示在那個時候,人們顯然是好的,或者我預計它會在訪問.isSelf時更早死掉。 (它可以做成布爾型,但我發現有兩種布爾型,一種BOOL和一種NSNumber,容易出錯)。如果person.bib是零,那麼調用它的長度仍然應該返回0?但它不可能零,因爲「圍兜」是這些實體的關鍵,而且沒有它就沒有創造。在這個階段沒有任何東西從商店中被刪除,這是自上次添加以來已經保存的新鮮商店。

回答

2

問題的原因:

NSDictionary *resultDict = [responseString JSONValue]; 
    NSString* bib = [resultDict objectForKey:@"bib"]; 
     person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:moc]; 
     person.bib = bib; 

[...很多的東西建立了個人關係等]

NSError *error; 
    if (![moc save:&error]) 
    { 
    NSLog(@"Core Data Save error %@, %@", error, [error userInfo]); 
    } 

的修復:

person.bib = [bib copy]; 

似乎像bib字符串在Person實體保存時無效。

0

要做的最好的事情是在可執行文件中設置NSZombieEnabled並從那裏調試它。這樣你就可以看到造成問題的原因。

+0

這是一個很好的方法來找出問題所在 - 但我縮小了範圍,問題是「這怎麼可能」而不是「我爲什麼會崩潰」?使用主鍵(標記爲非可選)接收核心數據對象爲零是非常令人驚訝的。 – 2010-08-30 00:33:21

0

如果您正在加載一些變量,請確保在釋放它們時將它們設置爲零,因爲如果下次訪問時它們不變。他們不會被「跳過」,你的應用程序會嘗試使用它們,但是因爲它們沒有指向一個有效的對象,所以它會失敗,並給你錯誤,如EXC_BAD_ACCESS

+0

不是真的 - 我只是在完成提取後才使用Person實體,如圖所示。它們可以使用[managedObjectContext deleteObject:person]來刪除;但從未採用相同的方法。 – 2010-08-30 00:44:52

0

Person.bib可能尚未加載。

您是否將bib屬性定義爲@dynamic而不是@synthesize?

您是否重寫了bib存取方法?如果是這樣,你的覆蓋需要KVO友好。

+0

我沒有碰過Xcode生成的文件。 – 2010-08-30 00:45:12

相關問題