программирование iPhone: avaudioplayer теряет память при игре - PullRequest
2 голосов
/ 16 сентября 2009

Я новичок в использовании avadioplayer, и у меня, кажется, есть память, когда я играю звук. Я не могу понять, чего мне не хватает, чтобы избавиться от этого внутри Инструмента. это может быть ложным срабатыванием?

ViewController.h:

@interface ISpectatorViewController : UIViewController <UIAccelerometerDelegate>{

AVAudioPlayer *massCheerSoundID;

}

@property(nonatomic,retain) AVAudioPlayer * massCheerSoundID;

// ViewController.m

- (void)viewDidLoad {

    NSString * filePath;

    filePath = [[NSBundle mainBundle] pathForResource:@"massCheer" ofType:@"mp3"];

    massCheerSoundID = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath ]error:nil];

}

- (void) playSound
{

        if(massCheerSoundID.playing == false)
    {

        massCheerSoundID.currentTime = 0.0;


                //leak here
        [massCheerSoundID play];
    }
}

- (void)dealloc {

    [super dealloc];
    [massCheerSoundID release];

}

Я выяснил, в чем проблема.

Я должен добавить AVAudioPlayerDelegate на интерфейс, поскольку вместо этого я установил UIAccelerometerDelegate

@interface iSpectatorViewController: UIViewController<AVAudioPlayerDelegate>

и установите

massCheerSoundId.delegate = self

Ответы [ 5 ]

3 голосов
/ 25 ноября 2009

Попробуйте добавить MediaPlayer.framework в ваш проект без изменений кода

2 голосов
/ 03 января 2010

Найдена такая же утечка сегодня. Добавление MediaPlayer.framework, кажется, исправляет это.

1 голос
/ 03 марта 2011

Найдена такая же утечка сегодня. Добавление MediaPlayer.framework, кажется, исправляет это.

Это сработало и для меня. Странно.

1 голос
/ 16 сентября 2009

Может ли это быть ваш dealloc метод?

Я думаю, что сначала договорились release, а затем позвонили [super dealloc].

Я всегда предполагал, что это означало "сначала выпустить ваши вещи, а затем обработать их вашим родительским классом".

Ваш dealloc метод должен выглядеть так:

- (void)dealloc {

    [massCheerSoundID release];
    [super dealloc];

}
0 голосов
/ 16 сентября 2009

Возможно, проблема в том, что вы перезапускаете massCheerSoundId снова и снова, если вы не изменяете свой вид. Итак, если вы добавляете свое подпредставление, вызывается viewDidLoad и вы инициализируете свой проигрыватель, то, возможно, вы удаляете подпредставление и добавляете его снова, поскольку вы не освободили представление (при условии, что у вас есть только одна копия), dealloc не вызывается ( в любом случае, я так не думаю), тогда, если вы снова добавите представление massCheerSoundId, которое будет переопределено и утечку .., другая проблема может заключаться в том, что, поскольку у вас есть massCheerSoundId в качестве свойства, вы выделяете его, и созданный установщик также сохраняет его, так что вы осталось +2 счетчика ссылок, когда он должен быть только +1 ... поэтому, предполагая, что мои предположения верны, я бы предложил написать viewDidLoad как это

    - (void)viewDidLoad {    
    NSString * filePath;   
     filePath = [[NSBundle mainBundle] pathForResource:@"massCheer" ofType:@"mp3"]; 
    if(massCharSoundId!=nil)
{
       AVAudioPlayer *p= [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURLfileURLWithPath:filePath ]error:nil];}
       massCheerSoundID = p;
     [p release];
}
...