2013-10-11 4 views
0

Итак, у меня есть эта проблема, мое приложение воспроизводит аудио, и оно сохраняло позицию воспроизведения всякий раз, когда приостанавливается, нажав кнопку или выбрав другую дорожку. Когда это происходит, я программно вызываю паузу и устанавливаю задержку в 0,5 сек., Прежде чем начинать воспроизведение следующей дорожки, вот где проблема.Основные данные, неисправность и NSZombieEnabled = EXC_BAD_ACCESS

Код мертв просто.

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]. Я понял, что, так как я также вызываю функцию каждые несколько секунд, это не критично, если она не сохраняет в этой конкретной точке. Он отлично работает с 0 сообщений от NSZombie.

Приходит проблема, когда я снял NSZombieEnabled, приложение отключается на [_nowPlaying isFault] с EXC_BAD_ACCESS. Что, очевидно, означало, что у меня есть a plain old crash.

Теперь я полностью потерян. Любая идея, куда идти отсюда?

Update: отвечая на @ArkadiuszHolko комментарий

Думал, что это было очевидно, но вот это:

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

И setPlayback просто

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

(Боковое примечание, не связанное с вашей проблемой: 'if (x && x> 0)' такое же, как 'if (x> 0)'.) –

+0

Можете ли вы показать код, ответственный за «Я программно вызываю паузу: и установите задержку в 0,5 сек., прежде чем начинать воспроизведение следующей дорожки, в этом случае возникает проблема. –

+0

@ArkadiuszHolko обновлен. И MartinR, да, я знаю, но в начале dev, я столкнулся с x, по какой-то причине, и это не сильно влияет на производительность. Поэтому я просто оставил его там. – soemarko

ответ

0

Вы используете ARC? - кто держится за _nowPlaying?

Лучший способ в моем опыте, чтобы установить, если объект удален является

[myManagedContext existingObjectForObjectID: _nowPlaying.objectID]!=nil 
+0

Да к ARC. Синглтон держит _nowPlaying. И этот код по-прежнему падает с «*** Завершение приложения из-за неотображенного исключения» NSInvalidArgumentException, причина: '- [__ NSCFDictionary objectID]: непризнанный селектор, отправленный в экземпляр 0x104ab9c0''. Кажется, что, пока _nowPlaying не ноль, я ничего не могу прочитать от него. Заставляя его быть нулевым и пропустив точку сохранения на несколько секунд, все же лучшее решение. Но я оставлю этот вопрос открытым и создаю снимок, продолжая работать над другими вещами. – soemarko

0

В ответ на ваш комментарий:

И этот код все еще врезаться с * Нагрузочный приложение из-за uncaught exception 'NSInvalidArgumentException', reason: '- [__ NSCFDictionary objectID]: непризнанный селектор, отправленный экземпляру 0x104ab9c0'.

кажется, что ваш _nowPlaying (или какой-либо другой объект) является NSDictionary, где ядро ​​Data ожидает, что это будет NSManagedObject.

Смежные вопросы