【问题标题】:Leaking in [AVPlayer addBoundaryTimeObserverForTimes]泄漏 [AVPlayer addBoundaryTimeObserverForTimes]
【发布时间】: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


【解决方案1】:

不要使用 -retainCount。

对象的绝对保留计数是没有意义的。

您应该调用release 的次数与您导致对象被保留的次数完全相同。不会少(除非您喜欢泄漏),当然也不会更多(除非您喜欢崩溃)。

详情请参阅Memory Management Guidelines


在这种特定情况下,您打印的保留计数完全无关紧要。 removeTimeObserver: 可能是保留和自动释放对象。没关系;这是一个实现细节。

在 Instrument 中使用 Leaks 模板时,请注意 Allocations 工具配置为记录参考计数。当您检测到“泄漏”时,请查看该对象的引用计数事件列表。可能会有一个堆栈,您的某些代码会触发额外的保留。如果不是,则可能是框架错误。

【讨论】:

    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多