[AVPlayer addBoundaryTimeObserverForTimes]
问题描述:
泄漏在我的应用程序中有一个AVPlayer
的实例。我用的时间边界观测功能:[AVPlayer addBoundaryTimeObserverForTimes]
[self setTimeObserver:[player addBoundaryTimeObserverForTimes:watchedTimes
queue:NULL usingBlock:^{
NSLog(@"A: %i", [timeObserver retainCount]);
[player removeTimeObserver:timeObserver];
NSLog(@"B: %i", [timeObserver retainCount]);
[self setTimeObserver:nil];
}]];
的问题是,根据仪器我泄露了一些数组和值围绕某处此代码。我在示例代码中检查了标记为A和B的位置上由AVPlayer
返回的时间观察令牌的保留计数。在A点保留计数是2,在B点保留计数增加到3(!)。添加本地autorelease池不会改变任何东西。我知道保留数不是一个可靠的指标,但这似乎是可疑的。关于为什么保留数增加或关于泄漏的任何想法?在泄漏点的堆栈跟踪看起来是这样的:
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
完全相同的次数导致对象被保留。没有更少(除非你喜欢泄漏),当然,没有更多(除非你喜欢崩溃)。
查看Memory Management Guidelines的全部细节。
在这种特定情况下,您打印的保留计数完全不相关。 removeTimeObserver:
可能会保留并自动释放该对象。没关系;它是一个实现细节。
当使用泄漏模板仪器,注意分配仪器配置,以创纪录的引用计数。当您检测到“泄漏”时,请查看该对象的引用计数事件列表。可能会有一堆你的一些代码触发额外的保留。如果没有,它可能是一个框架错误。
您是否找到了解决方案?我在使用这个观察者时泄漏了一个__NSArrayI和CMTimeAsValue对象 – Bastian 2011-05-23 13:25:00
不,我已经切换到不同的视频回放技巧来摆脱观看所有时间边界的时间边界。 – zoul 2011-05-24 07:00:06
感谢您的回答:) – Bastian 2011-05-24 08:45:16