gpt4 book ai didi

ios - ivar 中 AVAudioPlayer 的内存未被重用

转载 作者:可可西里 更新时间:2023-11-01 06:16:16 24 4
gpt4 key购买 nike

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

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

最佳答案

在切换到 Automatic Reference Counting [ARC] 之前,我的应用程序遇到了同样的问题,内存使用量会增加,直到应用程序崩溃,对吧?解决这个问题最快的方法是在你的应用程序/项目中也使用 ARC,事实上它会完成管理内存的所有工作并在需要时释放 AVAudioPlayer [你不需要任何-void(dealloc) 在你的代码中,如果你使用 ARC],所以没有更多的泄漏:-)。如果您不知道 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

关于ios - ivar 中 AVAudioPlayer 的内存未被重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14063018/

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