gpt4 book ai didi

xcode - AVCam 内存不足警告

转载 作者:行者123 更新时间:2023-12-04 09:27:48 25 4
gpt4 key购买 nike

这不是一个问题,而是我在 Apple 为 iOS4 和 5 相机操作提供的 AVCam 示例代码中发现的内容的记录。对我来说,问题的症状是我的应用在拍摄了大约 5-10 张照片后在启动 AVCamViewController 时会崩溃。

我通过内存泄漏分析器运行该应用程序,没有明显的泄漏,但在使用 Activity Monitor 检查时,我发现每次启动相机时,名为 mediaserverd 的东西都会增加 17Mb,当它达到 ~100Mb 时,应用程序会因多个低点而崩溃内存警告。

最佳答案

我做的第一件事是将日志记录到所有 AVCam 文件的 dealloc 方法中。我很快发现 AVCamCaptureManager 和 AVCamRecorder 没有在 AVCamViewController 被释放时被释放。我检查了保留和释放调用,它们似乎平衡了,所以我在 [captureManager 释放] 上放置了一个断点,发现它在释放后具有 2 的 retainCount (因此没有调用 AVCamCaptureManager 释放)。

接下来,我逐步完成了捕获管理器的创建过程,发现在调用 init 方法后立即保留计数为 3。

逐步执行 init 方法并检查每一行的保留计数,我发现以下两行都在增加保留计数:

[self setDeviceConnectedObserver=[notificationCenter addObserverForName:AVCaptureDeviceWasConnectedNotification object:nil queue:nil usingBlock:deviceConnectedBlock]];
[self setDeviceDisconnectedObserver=[notificationCenter addObserverForName:AVCaptureDeviceWasDisconnectedNotification object:nil queue:nil usingBlock:deviceDisconnectedBlock]];

通过查看,我发现 removeObserver 对应项位于 AVCamCaptureManager 的 dealloc 方法中(没有被调用),因此保留计数从未下降到 0。

为了修复它,我创建了一个新的公共(public) removeObservers 方法:
 -(void)removeObservers {
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter removeObserver:[self deviceConnectedObserver]];
[notificationCenter removeObserver:[self deviceConnectedObserver]];
}

并从 AVCamCaptureManager dealloc 方法中取出相同的行。

调用 [captureManager removeObservers];然后调用 [captureManager release];在 AVCamViewController dealloc 方法中成功将保留计数降至 0。

使用 Activity Monitor 进行测试时,现在 mediaserverd 进程的嗡嗡声只有 5-17Mb,并且崩溃停止了!

希望这可以帮助其他遇到此问题的人!

关于xcode - AVCam 内存不足警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7791002/

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