2011-11-04 144 views
4

我正在使用核心数据在数据库中输入歌曲详细信息。我有3个观点为此..首先是选择歌曲名称和它的详细信息视图来保存数据库中的细节..第三个视图是显示保存的歌曲..我的应用程序正在保存数据,有时会给予例外。保存数据时核心数据应用程序崩溃

我发现它什么时候发出异常。如果我选择歌曲并将其保存在数据库中,则会正确保存。但是当我第一次去第三视图。 Songlistviewcontroller然后打开歌曲,并尝试将其保存详细介绍它提供了有关节约线路异常..

011-11-04 11:14:10.578 SongsWithLyrics [259:207] * - [SongsListViewController controllerDidChangeContent: ]:消息发送到释放实例0x5b73b50

这里是

//save song details 
- (IBAction)saveDetails:(id)sender { 

    NSError *error; 
    self.song = [NSEntityDescription insertNewObjectForEntityForName:@"Song" inManagedObjectContext:managedObjectContext]; 


    [song setValue:songTitleString forKey:@"songTitle"]; 
    [song setValue:albumNameText.text forKey:@"albumName"]; 
    [song setValue:artistNameText.text forKey:@"artistName"]; 
    [song setValue:albumGenreText.text forKey:@"albumGenre"]; 
    [song setValue:UIImagePNGRepresentation(artworkImageview.image) forKey:@"artworkImage"]; 


    if (![managedObjectContext save:&error]) 
    { 
     NSLog(@"Problem saving: %@", [error localizedDescription]); 
    } 



    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Saved" message:@"" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
    [alert show]; 
    [alert release]; 

    [self.navigationController popViewControllerAnimated:YES]; 




} 

我坚持这个问题我的代码保存歌曲..并且不能understan为什么会发生这种情况。

早些时候我的申请流程是.. SongsListviewController-> Songs-> SaveSongs

,这是工作的罚款。对于这一点。

请帮

+0

你100%确定错误在你打电话保存的那行:?你粘贴的错误信息让我怀疑这一点。 – Steve

+0

YES ..它显示EXC_BAD_Access上if(![managedObjectContext save:&error]) – iProgrammer

+0

你可以添加完整的堆栈跟踪?另外,您是否已经通过了所有标准的EXC_BAD_ACCESS故障排除步骤?启用NSZombies等? – Steve

回答

6

有几个有趣的方式核心数据得到“鬼祟”你并能保持对周围事物不存在了引用。

在这种情况下,NSFetchedResultsController是犯罪嫌疑人。

您设置NSFetchedResultsController的委托 - 后来得到更新 - 除了您的委托实例不在处理该更新。

一些背景资料:

如果为已取得的成果控制器的委托, 寄存器从管理对象 方面收到变更通知控制器。处理影响结果集或 部分信息的上下文中的任何更改都会被处理,并相应地更新结果 。当结果对象 更改位置或修改部分时,控制器通知代理(请参阅 NSFetchedResultsControllerDelegate)。您通常使用这些方法 来更新表格视图的显示。

当你设置这样的代表(ARC前)时,确保你没有任何弱引用是很重要的,因为它们不会自动调零 - 而且如果留在原地,它们可能会中断。

解决方案很简单;将实例取消分配时,将委托设置为零。