系统声音的 ARC 内存管理问题

Posted

技术标签:

【中文标题】系统声音的 ARC 内存管理问题【英文标题】:ARC memory management issue with system sounds 【发布时间】:2012-05-06 16:12:36 【问题描述】:

我正在使用...播放系统声音

    NSString *path = [NSString stringWithFormat:@"%@%@",
                      [[NSBundle mainBundle] resourcePath],
                      @"/heartbeat.wav"];

    //declare a system sound id
    SystemSoundID soundID4;

    //Get a URL for the sound file
     NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];

    //Use audio sevices to create the sound
    AudioservicesCreateSystemSoundID((__bridge_retained CFURLRef)filePath, &soundID4);

    //Use audio services to play the sound
    AudioServicesPlaySystemSound(soundID4);

    AudioServicesDisposeSystemSoundID(soundID4);

我不确定这是不是问题.. 但如果它使用“分析”运行,它就会出现潜在的泄漏。随着我在模拟器中运行的次数越来越多,应用程序变得越来越慢,显然存在某种泄漏。我找到了如何在不使用 arc 的情况下处理此问题的示例,但没有。任何建议将不胜感激。

【问题讨论】:

您可以将此文件的 ARC 作为 B 计划关闭 是的,我考虑过……这会导致对事情的重大重写,就像我设置的那样。 【参考方案1】:

“它是潜在的泄漏”。 “它”是什么?

其次,您不会通过观察程序变得越来越慢来分析内存泄漏。事实上,这不是内存泄漏的正常症状,除非您正在耗尽物理 RAM 并导致大量交换。您可以通过使用诸如泄漏工具之类的工具实际识别不再可访问的内存来诊断泄漏。

也就是说,你不需要__bridge_retained,你只需要__bridge。我更喜欢 CFBridgingRetain()CFBridgingRelease() 函数而不是 __bridge_retained__bridge_transfer 转换的原因之一是你犯这样的错误的可能性要小得多。例如,你永远不会写:

AudioServicesCreateSystemSoundID(CFBridgingRetain(filePath), &soundID4);

首先,很明显没有必要保留filePath 只是为了将它传递给一个函数。其次,调用CFRetain() 风格的函数也清楚表明你有责任调用CFRelease() 风格的函数来平衡它。

【讨论】:

我在instruments下运行了代码,似乎总分配的内存没有增加。运行代码后,一旦转换速度变慢。诸如键盘弹出屏幕之类的东西...标签加载淡入淡出缓慢。如果不是内存问题,那会是什么? 不确定。检查是否有东西占用 CPU。 我发现它是什么.. 这是一个错误,但不知道为什么会这样。我对图像的不透明度进行了动画处理以使其淡出,最后我几乎连续做了两次。现在看来运行顺利。

以上是关于系统声音的 ARC 内存管理问题的主要内容,如果未能解决你的问题,请参考以下文章

笔记本没有声音喇叭无声怎么办

linux系统没有声音,该怎么驱动?

为啥录屏没声音

信创操作系统--麒麟Kylin桌面版 (项目三 控制中心:账户自定义个性化声音日期电源管理网络输入法系统更新等设置)

三星手机,安卓系统,怎么关闭照相机声音?

屏幕录制时没有声音是怎么回事