2011-04-18 39 views
0

我正在研究一个简单的声卡应用程序,只要按下按钮,它就会播放相应的声音。然而,我似乎并没有正确地发布我的变量(或者现在,因为我将代码恢复到播放声音的地方,但存在内存泄漏),我知道它不符合应用商店标准。我需要弄清楚如何解决这个问题,所以任何帮助表示赞赏!简单的Soundboard应用程序中的iOS AudioPlayer内存泄漏

我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]; 





} 

...但是,然后声音拒绝播放。所以我不知所措,因为每当我尝试在这些功能中的任何地方释放“音频”时,它都不会识别它释放它。帮帮我!

回答

3

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

即:

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

一旦你做到了这一点,就可以成功了。