我的应用程序中有一个实例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:
,还是时间观察者。