代码之家  ›  专栏  ›  技术社区  ›  zoul

[AVPlayer addBoundaryTimeObserverForTimes]中泄漏

  •  2
  • zoul  · 技术社区  · 15 年前

    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];
        }]];
    

    问题是,根据工具,我在代码的某个地方泄漏了一些数组和值。我查了一下 AV播放器

       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: ,或时间观察者。

    1 回复  |  直到 15 年前
        1
  •  2
  •   bbum    15 年前

    不要使用-retainCount。

    你应该打电话 release

    Memory Management Guidelines


    在这种情况下,打印的保留计数完全不相关。 removeTimeObserver: 可能是在保留和自动删除对象。其实并不重要;这是一个实现细节。

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

    推荐文章