1

このオブザーバーを備えた 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.runAfterEveryFramenilであり、 内のコンテンツは実行されるifべきではありませんが、 内で実行されてクラッシュしていifます。

4

2 に答える 2

-1

非同期ブロック内での弱い変数の 2 回目の使用は安全ではないため、常にブロック内で弱い変数を強い変数にキャストしてください。自己は弱くキャプチャされますが、ブロックから保持されます

    __weak myType *weakType = self;

    //dispatch block

   //INSIDE block
    __strong myType *strongType = weakType;
于 2014-12-26T17:30:02.667 に答える