さまざまな時間にさまざまなオーディオ データを再生するために使用している 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 に設定し、この回答に示すように、設定後に self.player を自動解放しようとしました。(最後の回答の問題のように、プレーヤーの初期化でエラーが発生することはありません。)これらすべてのケースで、メモリ使用量は増え続け、二度と減ることはありません。
オーディオ プレーヤーを初期化するたびに割り当てられるメモリを再利用するために、他に何かする必要がありますか?