2

アプリケーションにのインスタンスがありAVPlayerます。時間境界監視機能を使用します。

[self setTimeObserver:[player addBoundaryTimeObserverForTimes:watchedTimes
    queue:NULL usingBlock:^{
        NSLog(@"A: %i", [timeObserver retainCount]);
        [player removeTimeObserver:timeObserver];
        NSLog(@"B: %i", [timeObserver retainCount]);
        [self setTimeObserver:nil];
    }]];

問題は、Instrumentsによると、このコードのどこかにいくつかの配列と値がリークしていることです。AVPlayerサンプルコードでAとBのマークが付いた場所から返された時間監視トークンの保持カウントを確認しました。Aポイントでは保持カウントは2ですが、ポイントBでは保持カウントが3(!)に増加します。ローカル自動解放プールを追加しても、何も変更されません。保持カウントが信頼できるメトリックではないことは知っていますが、これは怪しいようです。保持数が増える理由やリークについて何か考えはありますか?リークポイントでのスタックトレースは次のようになります。

   0 libSystem.B.dylib calloc
   1 libobjc.A.dylib _internal_class_createInstanceFromZone
   2 libobjc.A.dylib class_createInstance
   3 CoreFoundation __CFAllocateObject2
   4 CoreFoundation +[__NSArrayI __new::]
   5 CoreFoundation -[__NSPlaceholderArray initWithObjects:count:]
   6 CoreFoundation +[NSArray arrayWithObjects:count:]
   7 CoreFoundation -[NSArray sortedArrayWithOptions:usingComparator:]
   8 CoreFoundation -[NSArray sortedArrayUsingComparator:]
   9 AVFoundation -[AVPlayerOccasionalCaller initWithPlayer:times:queue:block:]
  10 AVFoundation -[AVPlayer addBoundaryTimeObserverForTimes:queue:usingBlock:]

私が物事を正しく理解している場合、は、または時間オブザーバーAVPlayerOccasionalCallerによって返される「不透明な」オブジェクトです。addBoundaryTimeObserverForTimes:queue:usingBlock:

4

1 に答える 1

3

-retainCountは使用しないでください。

オブジェクトの絶対保持数は無意味です。

releaseオブジェクトを保持させたのとまったく同じ回数を呼び出す必要があります。(リークが好きでない限り)それ以下ではなく、(クラッシュが好きでない限り)確かにそれ以上ではありません。

詳細については、メモリ管理ガイドラインを参照してください。


この特定のケースでは、印刷する保持カウントはまったく関係ありません。removeTimeObserver:おそらくオブジェクトを保持して自動解放しています。本当に重要ではありません。これは実装の詳細です。

InstrumentでLeaksテンプレートを使用する場合、 AllocationsInstrumentは参照カウントを記録するように構成されていることに注意してください。「リーク」を検出したら、そのオブジェクトの参照カウントイベントのリストを確認します。あなたのコードが余分な保持をトリガーしているスタックが存在する可能性があります。そうでない場合は、フレームワークのバグである可能性があります。

于 2010-11-13T18:08:52.133 に答える