核心数据,故障和NSZombieEnabled = EXC_BAD_ACCESS

时间:2013-10-11 07:11:28

标签: ios core-data nszombieenabled

所以,我有这个问题,我的应用程序播放音频,并且只要点按按钮或选择其他曲目,它就会在触发暂停时存储播放位置。当后者发生时,我以编程方式调用暂停:并在开始播放下一首曲目之前设置0.5秒延迟,这就是问题发生的地方。

代码很简单。

NSInteger x = [_player currentPlaybackTime];
if (x && x > 0) {
    [_nowPlaying setValue:[NSNumber numberWithInt:x] forKey:@"pausedAt"];

    NSError *ctxErr;
    if (![_context save:&ctxErr]) {
        NSLog(@"Save error: %@", [ctxErr localizedDescription]);
    }
}

(_ nowPlaying是NSManagedObject,如果有帮助的话)

它崩溃了[_nowPlaying setValue: forKey:]

所以,我将NSZombieEnabled添加到环境变量,并且日志报告“Caught CoreData无法解决错误”

好的,所以我检查了[_nowPlaying isFault],我想,因为我也每隔几秒就调用一次这个函数,如果它没有在那个特定点保存,那就不重要了。它与NSZombie的 0条消息一起正常工作。

出现问题,当我取消选中NSZombieEnabled时,应用程序在[_nowPlaying isFault]上使用EXC_BAD_ACCESS崩溃。这显然意味着我有a plain old crash

现在,我完全迷失了。不知道从哪里开始?

更新:回复@ArkadiuszHolko评论

认为这很明显,但现在是:

[[[SRAudioPlayer sharedAudioPlayer] player] pause];
[self performSelector:@selector(setPlayback) withObject:nil afterDelay:0.5f];

而setPlayback只是

NSManagedObject *episode = [_fetchedResultsController objectAtIndexPath:indexPath];
[[SRAudioPlayer sharedAudioPlayer] setNowPlaying:episode];

2 个答案:

答案 0 :(得分:0)

你在使用ARC吗? - 谁持有_nowPlaying?

根据我的经验确定是否删除对象的最佳方法是

[myManagedContext existingObjectForObjectID: _nowPlaying.objectID]!=nil

答案 1 :(得分:0)

回应你的评论:

  

由于未被捕获, * 终止应用程序的代码仍然崩溃   异常'NSInvalidArgumentException',原因:' - [__ NSCFDictionary   objectID]:无法识别的选择器发送到实例0x104ab9c0'。

您的_nowPlaying(或其他某个对象)似乎是NSDictionary,其中Core Data期望它为NSManagedObject