我正在使用Core数据在数据库中输入歌曲详细信息。我有3个视图..首先是选择歌曲名称及其详细视图以保存数据库中的详细信息..第三个视图是显示已保存的歌曲..我的应用程序正在保存数据,有时会提供异常。
我发现什么时候会发出异常。如果我选择歌曲并将其保存在数据库中,则可以正常保存。但是当我第一次去第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];
}
我坚持这个问题..并且无法理解为什么会发生这种情况。
之前我的申请流程是.. SongsListviewController-> Songs-> SaveSongs
并且它工作得很好..为此。
请帮忙
答案 0 :(得分:6)
Core Data可以通过几种有趣的方式对您进行“偷偷摸摸”,并且可以继续引用不再存在的内容。
在这种情况下,NSFetchedResultsController是嫌疑人。
您设置了NSFetchedResultsController的委托 - 后来得到了更新 - 除了您的委托实例不再处理该更新。
一些背景知识:
如果为获取的结果控制器设置委托,则为控制器 注册以从其托管对象接收更改通知 上下文。影响结果集或的上下文中的任何更改 处理部分信息并更新结果 因此。控制器在结果对象时通知代理 更改位置或修改部分时(请参阅 NSFetchedResultsControllerDelegate)。您通常使用这些方法 更新表视图的显示。
当你设置这样的代表(pre-ARC)时,确保你没有任何弱引用是很重要的,因为它们不会自动归零 - 如果它们保持原位它们就会中断。
解决方案很简单;当您的实例被取消分配时,将委托设置为nil。