Имам 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