アプリケーションにのインスタンスがあり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: