4

我设置了一个实例变量来引用我用来在不同时间播放不同音频数据的 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所示所示。(我没有收到初始化播放器的错误,就像最后一个答案中的问题一样。)在所有这些情况下,我的内存使用量一直在上升,并且再也不会下降。

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

4

1 回答 1

0

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

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

标题:

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

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

    /* Your other code here */
}

/* Your other code here */

@end

主要的:

#import "YourViewController.h"

@implementation YourViewController

/* Your other code here */

- (void)playAudioData:(NSData *)data
{
    NSError *playerError;
    self.player = [[AVAudioPlayer alloc] initWithData:data error:&playerError]; error:NULL];

    if (playerError)
    {
        NSLog(@"player error: %@", playerError);
    }

    [self.player play];

    /* No more need to release AVAudioPlayer, ARC will do the job */

}

/* Your other code here */

@end
于 2012-12-28T00:47:09.400 回答