このオブザーバーを備えた 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フレームごとに実行されるコードのブロックです。の場合、この 2 行はどのように実行されていますかmyself? nilそれはどうしてですか?
自分が nil の場合myself.runAfterEveryFrameはnilであり、 内のコンテンツは実行されるifべきではありませんが、 内で実行されてクラッシュしていifます。