【发布时间】:2011-05-08 23:31:48
【问题描述】:
我的应用程序中有一个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,我在此代码周围的某处泄漏了一些数组和值。我在示例代码中标记为 A 和 B 的地方检查了 AVPlayer 返回的时间观察令牌的保留计数。在 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: 或时间观察者返回的“不透明”对象。
【问题讨论】:
-
您找到解决方案了吗?我在使用这个观察者时泄漏了一个 __NSArrayI 和 CMTimeAsValue 对象
-
不,我已经切换到不同的视频播放技巧来摆脱一起观看的时间限制。
标签: memory-leaks ios avplayer