Simple Soundboard App中的iOS AudioPlayer内存泄漏

时间:2011-04-18 19:59:26

标签: objective-c ios

我正在制作一个简单的音板应用程序,无论何时按下按钮,它都会播放相应的声音。但是,我似乎没有正确地释放我的变量(或者现在真的没有,因为我将我的代码恢复到播放声音但工作内存泄漏的地方)并且我知道它不符合app store标准。我需要弄清楚如何解决这个问题,所以任何帮助都表示赞赏!

我的ViewController.h是:

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


@interface FirstViewController : UIViewController <AVAudioPlayerDelegate>
 {

}

-(IBAction)pushTropical;
-(IBAction)pushVakidis;
-(IBAction)pushTwiggy;
-(IBAction)pushScootsy;
-(IBAction)pushJackiePass;
-(IBAction)pushJackieIntro;
-(IBAction)pushBB;
-(IBAction)yourProblem;
-(IBAction)pushSuckMy;
-(IBAction)pushBallGirl;
-(IBAction)pushGoofballs;
-(IBAction)pushHavingFun;
-(IBAction)pushwhoBambi;
-(IBAction)pushExcited;
-(IBAction)pushdirtyHippie;
-(IBAction)pushBambiMother;
-(IBAction)pushEverybodyPanic;
-(IBAction)pushSmallChild;
-(IBAction)pushBurnHouse;
-(IBAction)pushTitanic;
-(IBAction)pusherection;

@end

我的ViewController.m是:

#import "FirstViewController.h"
#import "AVFoundation/AVAudioPlayer.h"



@implementation FirstViewController

-(IBAction)pushTropical {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"Tropical" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];





}

-(IBAction)pushVakidis {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"Vakidis" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}
-(IBAction)pushBB {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"BB" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushTwiggy {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"Twiggy" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushScootsy {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"Scootsy" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushJackiePass {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"JackiePass" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushJackieIntro {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"JackieIntro" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushyourProblem {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"yourProblemShort" ofType:@"m4a"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushBallGirl {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"ballgirl" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushGoofballs {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"goofballs" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushSuckMy {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"yourfamily" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushHavingFun {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"dukesBase" ofType:@"m4a"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushwhoBambi {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"whoBambi" ofType:@"m4a"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushExcited {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"dukesIsExcited" ofType:@"m4a"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushdirtyHippie {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"dirtyhippie" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushBambiMother {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"BambiMother" ofType:@"m4a"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushEverybodyPanic {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"EverybodyPanic" ofType:@"m4a"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushSmallChild {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"SmallChild" ofType:@"m4a"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushBurnHouse {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"BurnHouse" ofType:@"m4a"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pushTitanic {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"Titanic" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

-(IBAction)pusherection {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"erection" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


}

/*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
*/

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/

/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
}
*/

/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];


    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];

}

@end

我尝试在各种推送方法(pushTropical,pushBurnHouse等)中发布'theAudio'变量,就像这样......

-(IBAction)pushExcited {
    NSString *path = [[NSBundle mainBundle]
                      pathForResource:@"dukesIsExcited" ofType:@"m4a"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];

    [theAudio release];





}

......然而,声音完全拒绝播放。所以我很茫然,因为无论何时我尝试在任何地方发布'theAudio',但在这些功能内部它都不会识别它以释放它。救命啊!

1 个答案:

答案 0 :(得分:3)

在将类设置为委托后,您应该通过audioPlayerDidFinishPlaying:successfully: AVAudioPlayerDelegate方法释放AVAudioPlayer。

即:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    [player release];
}

一旦你完成了这一切,一切都会好起来的。