У меня есть AVPLayer с этим обозревателем
__weak typeof(self.player) myPlayer = self.player;
myself.timer = [myself.player addPeriodicTimeObserverForInterval:interval
queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
usingBlock: ^(CMTime time) {
if (myself.runAfterEveryFrame) {
Float64 currentTime = CMTimeGetSeconds([myPlayer currentTime]);
myself.runAfterEveryFrame(currentTime); // crashes here
}
}];
Игрок находится на self.player
.
Это приложение загружает фильмы последовательно. Когда фильм заканчивается, приложение создает новый AVPlayer
, загружает ресурс и сохраняет его в self.player
. Что-то типа:
AVPlayer *newPlayer = ... init new player
// load assets, create new periodic observers, etc.
// new player is ready
self.player = newPlayer;
Это работает нормально, но после воспроизведения 3 или 4 фильмов происходит сбой на линии.
myself.runAfterEveryFrame(currentTime); // crashes here
с myself = nil
.
Вот в чем вопрос. Есть это, если
if (myself.runAfterEveryFrame) {
Float64 currentTime = CMTimeGetSeconds([myPlayer currentTime]);
myself.runAfterEveryFrame(currentTime); // crashes here
}
runAfterEveryFrame
— это блок кода, который запускается после каждого кадра. если myself
равно nil
, как выполняются эти две строки? Как это может быть?
если я равен нулю, то myself.runAfterEveryFrame
равен nil
, а содержимое внутри if
не должно запускаться, но оно работает и падает внутри if
.
__weak MyClass *myself = self;
? - person JuJoDi   schedule 26.12.2014addPeriodicTimeObserverForInterval:queue:usingBlock:
(developer.apple.com/library/mac/documentation/AVFoundation/) говорит, что очередь должна быть последовательной очередью. Вы используете глобальную очередь, которая является параллельной очередью. В документации говорится, что использование параллельной очереди приводит к неопределенному поведению. - person newacct   schedule 27.12.2014