我设置了一个实例变量来引用我用来在不同时间播放不同音频数据的 AVAudioPlayer。我的头文件包含:
AVAudioPlayer *player;
和
@property (nonatomic, retain) AVAudioPlayer *player;
我的实现文件包含:
- (void)playAudioData:(NSData *)data {
NSMutableData *trimmedData = [NSMutableData dataWithData:data];
int duration = 2; // seconds
int dataLength = duration * 2 * 44100; // assumes 16-bit mono data
[trimmedData setLength:dataLength];
NSError *playerError;
self.player = [[AVAudioPlayer alloc] initWithData:trimmedData error:&playerError];
[self.player autorelease]; // ADDED
if (playerError) {
NSLog(@"player error: %@", playerError);
}
[self.player play];
if (([[[UIDevice currentDevice] systemVersion] compare:@"6.0"] != NSOrderedAscending)&&([[[UIDevice currentDevice] systemVersion] compare:@"6.1"] == NSOrderedAscending)) {
[trimmedData autorelease]; // ADDED
}
}
- (void)dealloc {
[self.player release];
}
在分析我的应用程序的内存使用情况时,我注意到调用此方法会将实时字节增加 500k,这大约是我正在播放的音频数据的大小。但是,如果我再次调用该方法,则每次调用该方法时,活动字节都会再增加 500k 和另一个。
根据这个 SO answer,我不应该在这里做任何不同的事情,因为设置 self.player 变量会减少现有值的保留计数。但我也尝试在给它一个新值之前释放 self.player 并将其设置为 nil ,如this answer所示,并在设置后自动释放 self.player ,如this answer所示所示。(我没有收到初始化播放器的错误,就像最后一个答案中的问题一样。)在所有这些情况下,我的内存使用量一直在上升,并且再也不会下降。
我还需要做些什么来重用每次初始化音频播放器时分配的内存吗?