AVAudioRecorder 内存泄漏

2024-02-08

我希望有人能在这件事上支持我......

我一直在开发一个应用程序,该应用程序允许最终用户录制一个小音频文件以供以后播放,并且正在测试内存泄漏。当 AVAudioRecorder 的“停止”方法尝试关闭其正在录制的音频文件时,我仍然经常遇到内存泄漏。这看起来确实是框架本身的漏洞,但如果我是个傻瓜,你可以告诉我。

为了说明这一点,我开发了一个精简的测试应用程序,它除了按按钮启动/停止录制之外什么也不做。为了简单起见,一切都发生在应用程序中。委托如下:

@synthesize audioRecorder, button;
@synthesize window;

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
 // create compplete path to database
 NSString *tempPath = NSTemporaryDirectory();
 NSString *audioFilePath = [tempPath stringByAppendingString:@"/customStatement.caf"];

 // define audio file url
 NSURL *audioFileURL = [[NSURL alloc] initFileURLWithPath:audioFilePath];

 // define audio recorder settings
 NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
      [NSNumber numberWithInt:kAudioFormatAppleIMA4], AVFormatIDKey,
      [NSNumber numberWithInt:1], AVNumberOfChannelsKey,
      [NSNumber numberWithInt:AVAudioQualityLow], AVSampleRateConverterAudioQualityKey,
      [NSNumber numberWithFloat:44100], AVSampleRateKey,
      [NSNumber numberWithInt:8], AVLinearPCMBitDepthKey,
      nil
 ];

 // define audio recorder
 audioRecorder = [[AVAudioRecorder alloc] initWithURL:audioFileURL settings:settings error:nil];
 [audioRecorder setDelegate:self];
 [audioRecorder setMeteringEnabled:YES];
 [audioRecorder prepareToRecord];

 // define record button
 button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
 [button addTarget:self action:@selector(handleTouch_recordButton) forControlEvents:UIControlEventTouchUpInside];
 [button setFrame:CGRectMake(110.0, 217.5, 100.0, 45.0)];
 [button setTitle:@"Record" forState:UIControlStateNormal];
 [button setTitle:@"Stop" forState:UIControlStateSelected];

 // configure the main view controller
 UIViewController *viewController = [[UIViewController alloc] init];
 [viewController.view addSubview:button];

 // add controllers to window
 [window addSubview:viewController.view];
 [window makeKeyAndVisible];

 // release
 [audioFileURL release];
 [settings release];
 [viewController release];

 return YES;
}

- (void) handleTouch_recordButton {
 if ( ![button isSelected] ) {
      [button setSelected:YES];
      [audioRecorder record];

 } else {
      [button setSelected:NO];
      [audioRecorder stop];
 }
}

- (void) dealloc {
 [audioRecorder release];
 [button release];

 [window release];

 [super dealloc];
}

Instruments 的堆栈跟踪非常清楚地显示 AVFoundation 代码中的“closeFile”方法正在泄漏......某些东西。您可以在此处查看 Instruments 会话的屏幕截图:开发者论坛:AVAudioRecorder 内存泄漏 https://devforums.apple.com/message/182669

任何想法将不胜感激!


我没有看到任何东西,如果 Clang 没有在你的代码中发现泄漏,你的代码不太可能有错误。看起来像是框架中存在泄漏。

我不会担心的。用户按下停止键时发生 16 字节泄漏不太可能导致问题。在累积的泄漏量大到足以引起问题之前,您必须停止数千次录音。小泄漏仅在快速重复(例如在大循环中)时才需要考虑。

留下已知的泄漏是很烦人的,而且在美观上令人厌恶,但时间就是金钱,除非你知道这是一个严重的问题,否则我不会浪费在这上面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AVAudioRecorder 内存泄漏 的相关文章

随机推荐

  • 在javascript中将JSONArray转换为String以发送到java

    我正在使用一个使用phonegap 的Android 应用程序 java 调用一些显示网页的 HTML 而 HTML 使用 javascript 来实现功能 现在 在 javascript 中 我使用 HTML 中的参数进行 JSON 调用
  • servlet 应该执行多少个操作?

    我是 Web 开发新手 只是想知道 java servlet 的最佳实践 每个 servlet 是否应该只执行一个操作 即用于登录的 servlet 用于注册的 servlet 等 还是应该通过传递不同的参数来告诉 servlet 执行哪个
  • 通过 WinAPI 提取光标大小 (Windows 10)

    我需要提取光标图像以便在我的 swing 应用程序 Java 中使用它 首先 我发现类似的问题 https stackoverflow com questions 739870 extract cursor image in java 74
  • 如何使用 VBA 将 ShapeStyle 应用于 Excel 中图表的特定系列?

    如何使用 vba 以编程方式将 ShapeStyle 应用于单个图表系列中的一组点 看来我需要一个 形状 对象 其中仅包含我尝试格式化的系列中的点 一些信息在这里 http peltiertech com WordPress program
  • 检索网格的内容

    我在用jqGrid http www trirand com jqgridwiki doku php id start在客户端显示值 最初网格是空的 用户内联输入数据 根据要求 我需要在用户提交表单后提交数据 我打算在提交表单之前格式化内容
  • 串行端口重定向或拆分[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一本关于如何进行串行端口重定向或端口分割的书和 或代码示例 我编写了很多 com 端口应用程
  • 如何阻止Android硬件后退按钮在react-native的react-navigation中起作用?

    我正在开发一个问答游戏 我使用react navigation来处理导航 我有3个组件 newGame 问题 结果 如果没有 我不希望用户从结果页面返回到问题 问题已经用尽 但是 按后退按钮 Android 硬件 将使他回到问题 然后我尝试
  • Python、Flask客户端ip地址

    我需要记录我使用 Python 和 Flask 创建的 web 应用程序的每个用户的 IP 地址 我在用着 request remote addr 但这会返回应用程序部署到的服务器的 IP 地址 有解决办法吗 如何部署 Flask 应用程序
  • C++ 中静态全局标识符和非静态全局标识符有什么区别?

    有什么区别static全球和非staticC 中的全局标识符 静态将变量的范围限制为相同翻译单位 https stackoverflow com questions 1106149 what is a translation unit in
  • React/redux,显示多个组件,共享相同的操作,但具有不同的状态

    假设我有一个可重复使用的容器 它是一个具有多个页面的向导 向导状态由 redux actions 驱动 当一个动作被触发时 我使用一个减速器来更新我的状态 如果我想要复制多个向导并拥有自己的状态怎么办 我认为必须有一种方法可以让某个动态减速
  • 在nodejs(express)中的router.route()中设置中间件

    我想要它做什么 router post xxxx authorize xxxx function authorize req res next if xxx res send 500 else next 我想检查每条路线的会话 但既然路由器
  • 如何在没有 if 语句的情况下做出决定

    我正在学习 Java 课程 但我们还没有正式学习 if 语句 我在学习的时候看到这个问题 编写一个名为 pay 的方法 它接受两个参数 一个代表助教工资的实数 一个代表助教本周工作时数的整数 该方法应该返回付给TA多少钱 例如 调用 pay
  • @NSManaged 是做什么的?

    我在不同的场合都遇到过这个关键词 我有点知道它应该做什么 但我真的想更好地理解它 我注意到了什么 NSManaged 不是基于文档 而是通过重复使用 它神奇地取代了键值编码 大致相当于 dynamic在 Objective C 中 我不太了
  • 如何在 Haskell 中安装旧版本的 base

    我已经安装了Haskell平台 并且有7 10 3版本的ghci 其中有4 8 2 0版本的base 我需要安装gloss 1 8 哪个需要base 4 7 基础版本 我的问题是 当我已经有了新版本时 如何安装这个旧版本 是否可以 或者我必
  • ms-access:通过打印来填写申请表

    我将打印访问报告 该报告不会印刷成普通的白皮书 它将打印在带有复选框和字段的纸张上 我需要根据访问数据打印这些复选框和字段 有没有任何库可以让这变得更容易 是否有一个功能可以帮助在特定坐标上打印 请注意 我需要在数千份表格上打印 并且我必须
  • 使用准备好的语句后 SELECT LAST_INSERT_ID() 返回 0

    我正在使用 MySQL 和准备好的语句来插入BLOB记录 jpeg 图像 执行准备好的语句后 我发出一个SELECT LAST INSERT ID 它返回 0 在我的代码中 我在执行命令后放置了一个断点 并在 MySQL 命令 监视器 窗口
  • 为什么 Chrome 开发工具显示 200 状态代码而不是 304

    当我用 Chrome 测试缓存处理中的奇怪行为时 我问了一些关于它的问题 here https stackoverflow com questions 67016037 chrome doesnt send if none match he
  • Discord.js V12 粗鲁言语过滤器不起作用

    所以我添加了一个粗鲁的单词过滤器 每当有人说这个单词 小写或大写 时 它就会删除他们的消息并回复一些内容 然后回复会在几秒钟内被删除 这是我当前的代码 但它不读取rudeWords当我在聊天中写下任何粗鲁的话时 它不会做任何事情 clien
  • Rails4:康康舞还是康康康舞?使用 has_secure_password

    我正在尝试实现某种类型的用户 以便用户可以编辑数据 而其他用户只能读取 user rb class User lt ActiveRecord Base has secure password validates presence of em
  • AVAudioRecorder 内存泄漏

    我希望有人能在这件事上支持我 我一直在开发一个应用程序 该应用程序允许最终用户录制一个小音频文件以供以后播放 并且正在测试内存泄漏 当 AVAudioRecorder 的 停止 方法尝试关闭其正在录制的音频文件时 我仍然经常遇到内存泄漏 这