2

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

4

1 回答 1

3

不要使用 -retainCount。

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

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

有关完整的详细信息,请参阅内存管理指南


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

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

于 2010-11-13T18:08:52.133 回答