0

所以,我遇到了这个问题,我的应用程序播放音频,并在触发暂停时存储播放位置,无论是通过点击按钮还是选择其他轨道。当后者发生时,我以编程方式调用 pause: 并在开始播放下一首曲目之前设置 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到环境变量和日志报告“捕获的 CoreData 无法完成故障”

好的,所以我检查了[_nowPlaying isFault],我想因为我每隔几秒就调用一次该函数,如果它不在那个特定点保存,这并不重要。来自 NSZombie的0 条消息运行良好。

问题来了,当我取消选中 NSZombieEnabled 时,应用程序因[_nowPlaying isFault]EXC_BAD_ACCESS 而崩溃。这显然意味着我有一个普通的旧崩溃

现在,我完全迷失了。知道从这里去哪里吗?

更新:回复@ArkadiuszHolko 评论

以为很明显,但这里是:

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

而 setPlayback 只是

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

2 回答 2

0

回应您的评论:

由于未捕获的异常“NSInvalidArgumentException”,该代码仍然会崩溃,原因是:“-[__NSCFDictionary objectID]:无法识别的选择器已发送到实例 0x104ab9c0

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

于 2013-10-11T11:59:39.000 回答
0

你在用ARC吗?- 谁在坚持_nowPlaying?

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

[myManagedContext existingObjectForObjectID: _nowPlaying.objectID]!=nil
于 2013-10-11T09:59:13.590 回答