Утечка памяти при использовании AVAudioPlayer - PullRequest
1 голос
/ 12 марта 2011

Я анализирую утечки в моем коде Objective-C ++, используя инструментарий, и получаю следующее:

Leaked Object   Address Size    Responsible Library Responsible Frame
Malloc 32 Bytes,0x8135bc0   32 Bytes    AudioToolbox    SimAggregateDevice::SimAggregateDevice(__CFString const*, __CFString const*, long&)
__NSCFDictionary,0x8135be0  48 Bytes    AudioToolbox    CreateDictionaryForDevice(unsigned long)
Malloc 32 Bytes,0x8135c10   32 Bytes    AudioToolbox    CreateDictionaryForDevice(unsigned long)
Malloc 32 Bytes,0x8135c30   32 Bytes    AudioToolbox    CreateDictionaryForDevice(unsigned long)
Malloc 48 Bytes,0x8135c50   48 Bytes    AudioToolbox    SimAggregateDevice::SimAggregateDevice(__CFString const*, __CFString const*, long&)
__NSCFDictionary,0x813a820  48 Bytes    AudioToolbox    SimAggregateDevice::SimAggregateDevice(__CFString const*, __CFString const*, long&)
__NSCFArray,0x813a850   32 Bytes    AudioToolbox    SimAggregateDevice::SimAggregateDevice(__CFString const*, __CFString const*, long&)
__NSCFDictionary,0x813a870  48 Bytes    AudioToolbox    CreateDictionaryForDevice(unsigned long)
Malloc 32 Bytes,0x813a8a0   32 Bytes    AudioToolbox    SimAggregateDevice::SimAggregateDevice(__CFString const*, __CFString const*, long&)
Malloc 32 Bytes,0x813a8d0   32 Bytes    AudioToolbox    CreateDictionaryForDevice(unsigned long)

Я предполагаю, что это связано с кодом, который я написал для воспроизведения звука при запуске моего приложения. Я делаю это так: этот метод вызывается в applicationDidFinishLaunching ::

- (void)playJingle {
    // This is a detached thread so I need a new pool.
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    // This audio player will be released in  audioPlayerDidFinishPlaying.
    NSString *newAudioFile = [[NSBundle mainBundle] pathForResource:@"jingle" ofType:@"m4a"];
    AVAudioPlayer *av = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile] error:NULL];
    [av setDelegate:self];
    [av play];

    // Release.
    [pool release];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)av successfully:(BOOL)flag
{
    // Release the AVAudioPlayer.
    [av release];
}

в фоновом потоке (вызывается с помощью executeSelectorInBackground: withObject :). Я что-то пропустил? Почему у меня есть эти утечки? Спасибо!

Ответы [ 2 ]

6 голосов
/ 12 марта 2011

Вы пытались запустить приложение на устройстве?AVAudioPlayer склонен к ложным срабатываниям с обнаружением утечки памяти на симуляторе ...

Вот очень похожий вопрос с похожим отчетом об утечке

0 голосов
/ 12 ноября 2011

Это не может работать, вы присваиваете AVPlayer локальной переменной:

AVAudioPlayer *av = ...

, а не переменной экземпляра.

-(void>) playJinlge{
    ...
    self.av = .....
}

-(void) didfinish ... {
   [self.av release];
   self.av=nil;
}
...