AVAudioPlayer 导致内存泄漏

Posted

技术标签:

【中文标题】AVAudioPlayer 导致内存泄漏【英文标题】:AVAudioPlayer causing memory leak 【发布时间】:2011-11-08 14:57:14 【问题描述】:

不确定这是模拟器问题还是我遗漏了什么,下面的代码给了我一个内存泄漏,尽管 theAudio 像在 dealloc 中一样被释放。我正在播放一个 .wav 文件,声音会根据整数的值而变化。应用程序运行正常,但我在 xcode 中测试时标记了 16 位泄漏

非常感谢任何建议:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface Water : UIViewController 
<AVAudioPlayerDelegate>





@property (nonatomic,retain) AVAudioPlayer *theAudio;


-(IBAction) goButMenu: (id) sender;
-(IBAction) goDrinkMenu: (id) sender;
-(IBAction) playwater;


@end



@implementation Water
@synthesize theAudio;

-(IBAction) goDrinkMenu: (id) sender

ButDrinkMenu *butdrinkmenu1 = [[ButDrinkMenu alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:butdrinkmenu1 animated:YES];



-(void) viewDidLoad 

if (BoyOrGirl == 1) 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Applause" ofType:@"wav"];
    theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];




else 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"bongo" ofType:@"wav"];

    theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];









-(IBAction) playwater

if (BoyOrGirl == 1) 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Applause" ofType:@"wav"];
    theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];






else 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"bongo" ofType:@"wav"];
    theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];





【问题讨论】:

【参考方案1】:

肯定直接在设备上测试;使用模拟器测试泄漏可能会返回不准确的结果。

也就是说,此代码示例存在几个与内存相关的问题。您可能希望在此处包含您的 dealloc 方法,因为这可能会提供一些见解,但这里有一个问题(出现在您的几个分配中):

您的 AVAudioPlayer 未分配给您的财产,也未在范围内发布。理想情况下,玩家分配看起来更像:

AVAudioPlayer *myPlayer = [[AVAudioPlayer alloc] initWithContents....
[myPlayer setDelegate:self];
[self setTheAudio:myPlayer];
[myPlayer release];

与您实现它的方式相反,它直接为播放器分配实例变量:

theAudio = [[AVAudioPlayer alloc] initWith...

因为您将播放器直接分配给您的实例变量,所以您的播放器不会被保留。如果您尝试正确平衡调用,这可能会导致过早释放和悬空指针,否则会导致泄漏。

【讨论】:

谢谢,我做了一个快速测试,这段代码解决了泄漏,我需要做更多的测试,但看起来不错。干杯。

以上是关于AVAudioPlayer 导致内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVAudioPlayer 的内存泄漏

在 NSTimer 中播放 AVAudioPlayer,没有内存泄漏?

AVAudioPlayer 多重声音嘈杂

重用 AVAudioPlayer 以获得不同的声音

静音按钮不会静音 AVAudioPlayer

AVAudioPlayer 不播放音频文件 - swift