このオブザーバーを備えた 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
ます。