Утечка памяти — NSString и NSURL

@property ( nonatomic, strong ) NSURL * urlPath;

self.urlPath = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"bark" ofType:@"caf"]];

Запуск ARC, цель развертывания 4.3. Instruments дает утечку в строке self.urlPath =.

Self.urlPath используется позже после появления представления для настройки AVSoundPlayer. На звуковом проигрывателе теперь НЕТ утечки, только на этой линии NSURL. Звук воспроизводится, но при открытии представления происходит утечка памяти.

Любые идеи, поскольку я был в этом> 12 часов сейчас...


person iOSProgrammingIsFun    schedule 09.11.2012    source источник
comment
Попробуйте использовать метод URLForResource:withExtension: вместо pathForResource:, плеер тоже может подтекать.   -  person ksh    schedule 09.11.2012
comment
Вы получаете утечку со всеми версиями iOS SDK?   -  person Simon Whitaker    schedule 09.11.2012
comment
По какой причине вы используете URLWithString:? Обычно вы используете fileURLWithPath: для преобразования пути к файлу в экземпляр NSURL. Не уверен, что это как-то связано с вашей утечкой, но посмотреть стоит.   -  person Simon Whitaker    schedule 09.11.2012
comment
Я изменил метод setupSound на следующий: - ( void ) setupSound { NSURL * urlPath = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@bark ofType:@caf]]; self.player = [[AVAudioPlayer alloc] initWithContentsOfURL: ошибка URL-адреса: ноль]; [self.player setVolume:0.5f]; } Но теперь я получаю стопроцентную утечку в строке NSURL. Свойство аудиоплеера следующее: @property ( nonatomic, strong ) AVAudioPlayer * player; Я ДОЛЖЕН использовать цель развертывания 4.3, и я использую ARC   -  person iOSProgrammingIsFun    schedule 09.11.2012
comment
Также не забудьте позвонить [super viewDidAppear:animated] и [super viewWillDisappear:animated].   -  person Simon Whitaker    schedule 09.11.2012


Ответы (2)


Кажется, утечка памяти в Core Foundation только в iOS 6.

Поэтому зарегистрирован как ошибка:

Идентификатор ошибки № 12699818.

person iOSProgrammingIsFun    schedule 14.11.2012

Ваш плеер утекает, и если ваш плеер утекает, каждый игрок также сохранит свой URL и строковый объект.

self.player = [[[AVAudioPlayer alloc] initWithContentsOfURL:pingURL error:nil] autorelease];

Если вы объявили player в качестве сохраняемой собственности, то

self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:pingURL error:nil];

оставит счетчик ссылок равным 2.

self.player = nil;

сделает это 1.

person jimpic    schedule 09.11.2012
comment
Мой плеер объявлен как: @property ( nonatomic, strong ) AVAudioPlayer * player; - person iOSProgrammingIsFun; 09.11.2012
comment
Я должен поддерживать iOS 4.3, поэтому я не могу использовать «слабый» в объявлении свойства — есть ли что-то еще, что я должен делать? Я смущен тем, почему количество сохранений равно 2 после всего лишь одного выделения... - person iOSProgrammingIsFun; 09.11.2012
comment
@iOSProgrammingIsFun использует assign, а не weak, но будьте осторожны, потому что этот указатель не будет автоматически устанавливаться в nil при освобождении объекта. Но вы уверены, что вам не нужна ссылка strong, с которой вы просто работаете более правильно? - person Tommy; 10.11.2012
comment
сильный там в порядке, и это не проблема с дугой @jimpic не рассматривает дугу ... счет идет к 0 просто отлично. -- как насчет того, чтобы разделить вашу линию? чтобы лучше найти проблему - person Daij-Djan; 10.11.2012
comment
Если я разделю строку, NSString получит 33% утечки, а NSURL — 66%. 'назначить', 'сохранить', 'сильный', 'небезопасный_неудержанный' или любая комбинация не имеет никакого значения. - person iOSProgrammingIsFun; 10.11.2012