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 导致内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章