gpt4 book ai didi

iphone - iOS6 中的 AudioToolBox 泄露?

转载 作者:行者123 更新时间:2023-12-03 19:10:24 27 4
gpt4 key购买 nike

当我使用 AudioToolBox 播放音乐时,内存泄漏严重。

AVAudioPlayer *newMusicPlayer = [[AVAudioPlayer alloc] initWithData:data error:&error];

我用这个代码来播放音乐。在iOS5和iOS4中都可以正常工作。但在iOS6中,如果数据大小为5M,则这5M全部泄露。而且我在 Instruments 中看不到泄漏信息。

有人有同样的问题吗?任何建议将不胜感激。

这里是我所有的音频代码(使用 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 模拟器始终会泄漏内存,但设备不会。这已使用 Instruments 进行了验证。这是 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];

在我的委托(delegate)中,当播放器完成播放时,我将其设置为nil:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
if (player == self.numberPlayer) {
_numberPlayer = nil;
}
}

在模拟器中,AudioSessionDeviceUISoundNewDevice 都会泄漏内存。然而,最大的泄露者实际上是NSURL。这些泄漏都不会发生在设备上。这种行为在 iOS 6 中没有改变,但我确实将项目部署设置为 5.0,这应该会产生任何影响。

另请参阅https://stackoverflow.com/questions/3433487/avaudioplayer-leak-in-simulatormemory leak in AudioToolbox library AVAudioPlayer .

关于iphone - iOS6 中的 AudioToolBox 泄露?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12553031/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com