当我使用AudioToolBox播放音乐时,内存严重泄漏。
AVAudioPlayer *newMusicPlayer = [[AVAudioPlayer alloc] initWithData:data error:&error];
我使用此代码播放音乐。在 iOS5 和 iOS4 中,它可以正常工作。但在iOS6中,如果数据的大小是5M,那么所有的5M都会泄露。而且我在仪器中看不到泄漏信息。
有没有人有同样的问题?任何建议将不胜感激。
我所有的音频代码都在这里(使用 ARC):
@implementation ViewController
{
AVAudioPlayer *_player;
}
- (void)play
{
if (_player)
{
[_player stop];
_player = nil;
}
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"test.app/1.mp3"];
NSData *musicData = [[NSData alloc] initWithContentsOfFile:path];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:musicData error:nil];
player.volume = 1;
if (player)
{
_player = player;
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(100, 100, 100, 100);
[button setTitle:@"play" forState:UIControlStateNormal];
[button addTarget:self action:@selector(play) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
@end
我正在使用AVAudioPlayer
播放文件中的音频,发现iOS模拟器始终泄漏内存,但设备没有。这是使用仪器验证的。这是 ARC 代码。
我的播放器声明如下:
@property (nonatomic, retain) AVAudioPlayer *numberPlayer;
并像这样合成:
@synthesize numberPlayer = _numberPlayer;
由于我需要播放几种不同的声音,并且AVAudioPlayer
在创建后无法重置以播放不同的音频文件,因此我每次都会创建一个新播放器,如下所示:
NSString *audioFilePathName = [NSString stringWithFormat:@"Voices/%@/%03i.m4a", self.voiceName, self.theNumber];
NSURL *url = [NSURL fileURLWithPath:BUNDLE_FULL_PATH(audioFilePathName)];
self.numberPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
self.numberPlayer.numberOfLoops = 0;
[self.numberPlayer setCurrentTime:0.0];
[self.numberPlayer setDelegate:self];
[self.numberPlayer prepareToPlay];
[self.numberPlayer play];
在我的委托中,我将播放器设置为在播放完成后nil
:
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
if (player == self.numberPlayer) {
_numberPlayer = nil;
}
}
在模拟器中,AudioSessionDevice
和UISoundNewDevice
都会泄漏内存。然而,最大的泄密者其实是NSURL
。设备上不会发生这些泄漏。此行为在 iOS 6 中没有改变,但我确实将我的项目部署设置为 5.0,如果这有什么不同的话。
另请参阅 AudioToolbox 库 AVAudioPlayer 中的 https://stackoverflow.com/questions/3433487/avaudioplayer-leak-in-simulator 和内存泄漏。
也许你比我做得更好,我前面没有XCode,但是:
对象已创建,引用已创建:
AVAudioPlayer *newMusicPlayer = [[AVAudioPlayer alloc] initWithData:data error:&error];
它是分配而不是分配,没有保留:
_musicPlayer = newMusicPlayer;
函数外playMusicWithMusicData
它会释放newMusicPlayer
,并且当我使用 _musicPlayer
时,它会在其他函数中崩溃我的代码。分析器工具唠叨得如此之多,因为我保留了,也许也是一个版本。
如果您使用的是iOS4,那么ARC不是这个项目。
在 if 分支中:
[_musicPlayer stop];
_musicPlayer = nil;
我会检查_musicPlayer
不是零,但这不会解决你的问题。
不知道它可能在哪里,如果不是在ios中,它可能在那里:
如果您更改委托而不是自己,确实解决了。
_musicPlayer.delegate = self;
到其他班级吗?