gpt4 book ai didi

memory-leaks - 泄漏 [AVPlayer addBoundaryTimeObserverForTimes]

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:27:17 25 4
gpt4 key购买 nike

我的应用程序中有一个 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 返回的时间观察 token 的保留计数。在 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:]

如果我理解正确,AVPlayerOccasionalCalleraddBoundaryTimeObserverForTimes:queue:usingBlock: 返回的“不透明”对象,或者时间观察器。

最佳答案

不要使用 -retainCount。

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

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

参见 Memory Management Guidelines了解全部详情。


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

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

关于memory-leaks - 泄漏 [AVPlayer addBoundaryTimeObserverForTimes],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4163353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com