【问题标题】:AvAudioPlayer memory leaks?AvAudioPlayer 内存泄漏?
【发布时间】:2023-11-06 16:22:01
【问题描述】:

我正在做一个需要播放很多短声音(mp3 文件)的应用程序。我正在使用 AvAudioPlayer,声音播放得很好,但是泄漏正在累积,直到我的应用程序崩溃。

我有一个单独的播放器类

AVSnd.h

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>

@interface AVSoundPlayer : NSObject <AVAudioPlayerDelegate> {
  AVAudioPlayer *msoundPlayer;
}
@property (nonatomic, retain) AVAudioPlayer *msoundPlayer;
-(id)initWithMp3File: (NSString *)inString;
-(void) playNum:(int)num;
@end



AVSND.m

@implementation AVSoundPlayer
@synthesize msoundPlayer;

-(id)initWithMp3File: (NSString *)fileName{
  if (self = [super init]){
    NSBundle *mainBundle = [NSBundle mainBundle];
    NSError *error;
    NSURL *sURL = [NSURL fileURLWithPath:[mainBundle
                       pathForResource:fileName ofType:@"mp3"]];
    self.msoundPlayer = [[AVAudioPlayer alloc]
                        initWithContentsOfURL:sURL error:&error];
    if (!self.msoundPlayer) {
      NSLog(@"Sound player problem: %@", [error localizedDescription]);
    }
  }
  return self;
}

-(void) playNum:(int)num{
  self.msoundPlayer.numberOfLoops = num;
  [self.msoundPlayer prepareToPlay];
  AVAudioPlayer *tmpPlayer = self.msoundPlayer;
  [tmpPlayer play];
}

- (void)dealloc {
  [self.msoundPlayer release];
  [super dealloc];
}

@结束

然后我在我想要声音的视图中创建这个对象的一个​​实例。

在 .h 文件中我添加以下行:

@class AVSnd;
AVSnd *mPlayer;
@property (nonatomic, retain) AVSnd *mPlayer;

在我使用的 .m 文件中:

@synthezise mPlayer;
[self.mPlayer initWithMp3File:@"soundFileName"];
[self.mPlayer playNum:1];
[self.mPlayer release];

但是为什么每次播放声音时都会出现内存泄漏?我应该以其他方式实现播放器吗?

非常感谢您的帮助!

【问题讨论】:

  • 忘记在 AVSnd.m 中添加 playNum 方法了:-(void) playNum:(int)num{ self.msoundPlayer.numberOfLoops = num; //仅使用循环 1 [self.msoundPlayer prepareToPlay]; AVAudioPlayer *tmpPlayer = self.msoundPlayer; [tmpPlayer 播放]; }

标签: iphone ipad memory-leaks avaudioplayer avfoundation


【解决方案1】:

我遇到了同样的问题,用自动释放解决了它:

    self.audioPlayer = [[[AVAudioPlayer alloc]
                          initWithContentsOfURL:url error:&error] autorelease]; 

【讨论】:

    【解决方案2】:
    self.msoundPlayer = [[AVAudioPlayer alloc]
                        initWithContentsOfURL:sURL error:&error];
    

    在这里,您将对象保留两次,在 self. (因为属性),以及何时分配。可能是这个原因。

    【讨论】:

    • 我尝试将该行更改为:[self.msoundPlayer initWithContentsOfURL:sURL error:&error];但仍然泄漏。
    • 如果你这样做,你就不会分配内存......也许这样: AVAudioPlayer *helper = [[AVAudioPlayer alloc] initWithContentsOfURL:sURL error:&error]; self.msoundPlayer = 助手; [帮助释放];