来自ivar的AVAudioPlayer的内存未被重用

时间:2012-12-28 00:16:18

标签: ios memory-management avaudioplayer

我已经设置了一个实例变量来引用我用来在不同时间播放不同音频数据的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,而另一个则增加另一个。

根据this SO answer,我不应该在这里做任何不同的事情,因为设置self.player变量会减少现有值的保留计数。但我也尝试将self.player释放并设置为nil,然后给它一个新值,如this answer所示,并在设置后自动释放self.player,如this answer所示。 (我没有在初始化播放器时遇到错误,就像最后一个答案中的问题一样。)在所有这些情况下,我的内存使用率不断上升而且永远不会再次下降。

每次初始化音频播放器时,我还需要做些什么来重用分配的内存吗?

1 个答案:

答案 0 :(得分:0)

在切换到Automatic Reference Counting [ARC]之前,我的应用程序遇到了同样的问题,内存使用量会增加,直到应用程序崩溃为止,对吧?解决此问题的最快方法是在您的应用程序/项目中使用ARC,实际上它将完成管理内存的所有工作并在需要时释放AVAudioPlayer [您不需要任何{{1在您的代码中,如果您使用ARC],所以不再泄漏:-)。如果您不知道ARC是什么,您也可以查看此链接:

http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

标题

-void(dealloc)

主要

#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>

@interface YourViewController : UIViewController <AVAudioPlayerDelegate>
{
    AVAudioPlayer           *player;

    /* Your other code here */
}

/* Your other code here */

@end