1

変数がゾンビであるかどうかを確認したいのですが、そうでない場合は、このような関数があります。実際に存在する場合はスーパーレイヤーから削除する必要があります。すでに削除されている場合もありますが、ゾンビであるため、クラッシュしています。この点で。実行時に変数がゾンビであるかどうかを確認するにはどうすればよいですか?

 if (avPlayerLayer) {
         [avPlayerLayer removeFromSuperlayer];  
 }

私はそれを作成するためにこのコードを持っています:

if (!avPlayer) {
        avPlayer = [[AVPlayer alloc] initWithURL:movieURL];
    } else {
        [avPlayer replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithURL:movieURL]];
        avPlayer.rate = 0.0f;
    }
}
avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];

代わりにこのようなことをする必要がありますか?:

if (!avPlayer) {
        avPlayer = [[AVPlayer alloc] initWithURL:movieURL];
    } else {
        avPlayer = nil;
        avPlayer = [[AVPlayer alloc] initWithURL:movieURL];
        avPlayer.rate = 0.0f;
    }
}
avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];

何か助けはありますか?前もって感謝します!

4

2 に答える 2

1

代わりに変数をnilに設定してから、nilを確認してみませんか。

于 2012-02-23T15:36:05.140 に答える
0

最初の実装に単純な矛盾があるようです---

if (!avPlayer) {

    // This sets avPlayer to a retained object reference (retainCount==1)
    avPlayer = [[AVPlayer alloc] initWithURL:movieURL]; 
} else {
    // This sets avPlayer to an autoReleased object reference 
    // which will die as soon as the memory pool is drained next. 
    // You should have retained it before setting, and your problem will be gone.
    [avPlayer replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithURL:movieURL]];
    avPlayer.rate = 0.0f;
}

私は使うだろう:

[avPlayer replaceCurrentItemWithPlayerItem:[[AVPlayerItem playerItemWithURL:movieURL] retain]];

ところで、ゾンビのメカニズムは、クライアントのマシンで設定できないシステム構成(環境変数など)に依存しているため、実行時にオブジェクトの「ゾンビ性」を判断することはできません。これはデバッグ専用ツールであり、適切な開発手法ではありません。ゾンビはあなたのプログラムのバグです。ゾンビは、他の方法では追跡が非常に難しいメモリ関連のバグを見つけて排除するのに役立つことを目的としています。

于 2012-03-13T20:30:46.913 に答える