質問

のインスタンスがあります 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];
    }]];

問題は、楽器によると、このコードの周りのどこかにいくつかの配列と値を漏らしていることです。返された時間を増やすトークンの保持数を確認しました 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:, 、またはタイムオブザーバー。

役に立ちましたか?

解決

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

オブジェクトの絶対的な保持カウントは無意味です。

電話する必要があります release オブジェクトを保持したまったく同じ回数。それ以下(リークが好きでない限り)、そして確かに、それ以上(クラッシュが好きでない限り)。

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


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

を使用する場合 リーク 機器のテンプレート、に注意してください 割り当て 機器は、参照カウントを記録するように構成されています。 「リーク」を検出したら、そのオブジェクトの参照カウントイベントのリストを見てください。おそらく、あなたのコードが追加の保持をトリガーしているスタックがあるでしょう。そうでない場合、それはフレームワークのバグかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top