我的 AVFoundation/AVCaptureSession 泄漏内存在哪里?
Posted
技术标签:
【中文标题】我的 AVFoundation/AVCaptureSession 泄漏内存在哪里?【英文标题】:Where is my AVFoundation/AVCaptureSession leaking memory? 【发布时间】:2014-09-05 19:00:56 【问题描述】:我使用AVCaptureSession
来“录制”音频和视频,并使用AVAssetWriter
来实际录制它。当我的 viewController 加载时,视图显示来自相机的“实时馈送”,但尚未录制(存储到磁盘)。然而,内存使用逐渐增加,并且不会停止。我使用Instruments
并试图找到泄漏,但我不确定如何解释这一点。 VM:Allocation 16,00 KB
的行一直在增加,我不确定它是什么。
此时我的委托方法实现几乎什么都不做:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:
(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);
CFRetain(sampleBuffer);
CFRetain(formatDescription);
dispatch_async(movieWritingQueue, ^
//If recording
if(assetWriter)
//do stuff
);
CFRelease(sampleBuffer);
CFRelease(formatDescription);
问题是;加载视图时(在开始记录之前),assetWriter 始终为 nil,因为它应该是。因此,每次调用上述委托方法时,它实际上不应该做任何事情。
我从来没有做过太多的发布,因为 ARC 一直为我解决了这个问题。我对CF
-things 做错了吗?
我的方法是否每次都以某种方式存储这些变量之一?
【问题讨论】:
您购买这些 CFRetains 的原因是什么?这是一件非常奇怪的事情。 @matt 尽管在两者之间给出了dispatch_async()
,但它们并没有真正的影响。
@***foe 我完全支持你,但它仍然完全没有必要,很高兴知道所有删除的 CFRetain / CFRelease 对会发生什么。
@matt 我遵循了来自不同作者的教程和示例代码。如果我没记错的话,CFRetain/Release 来自 Apple 的Rosy Writer
。我只是认为他们在那里是为了防止其他异步线程丢失指针或类似的奇怪东西。无论如何,我已经删除了didOutputSampleBuffer
-方法中的所有内容,但我仍然得到这个泄漏。所以很明显是其他原因造成的。我将尝试进一步定位泄漏并在发现某些内容时更新问题。
@matt 由于应用程序在启动我的AVCaptureSession
后专门泄漏了内存,所以我当然得出了问题存在的结论。我搜索了我认为我遇到的问题的答案,但一无所获。当时,我没有理由搜索“无缘无故的内存泄漏”。当我已经找到答案时,您现在很容易搜索答案。当然,我本可以扩展我的查询并在此处发布之前花费更多时间查看不相关的主题,但我仍然认为您的最后一条评论是多余的。
【参考方案1】:
在这里回答我自己的问题:
在开发的早期,我打开了Enable Zombie Objects
以更好地调试我遇到的奇怪异常。显然,此设置创建僵尸,或者可能阻止 ARC 释放某些对象或其他什么。通过Product->Edit Scheme->Enable Zombie Objects
禁用此选项,它按预期工作,没有泄漏。
【讨论】:
以上是关于我的 AVFoundation/AVCaptureSession 泄漏内存在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 ListView 使我的应用程序崩溃而不是列出我的条目?
我的 tensorflow 没有检测到我的 gpu 并使用我的 cpu(机器学习)