0

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

    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 的情况下处理此问题的示例,但没有。任何建议将不胜感激。

4

1 回答 1

1

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

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

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

AudioServicesCreateSystemSoundID(CFBridgingRetain(filePath), &soundID4);

首先,很明显没有必要只保留filePath将其传递给函数。其次,调用CFRetain()-style 函数还表明您有责任调用CFRelease()-style 函数来平衡它。

于 2012-05-06T18:05:42.727 回答