2009-10-21 2 views
9

У меня есть следующий код, который протекает. Инструменты говорят, что объект rssParser протекает. Я "обновить" фид XML и запускает блок и утечки ....NSXMLParser Leaking

file.h

@interface TestAppDelegate : NSObject <UIApplicationDelegate> { 

    NSXMLParser *rssParser; 

} 

file.m

NSData *data = [ NSURLConnection sendSynchronousRequest:request returningResponse: nil error: nil ]; 
    rssParser = [[NSXMLParser alloc] initWithData:data]; 
    [rssParser setDelegate:self]; 
    [rssParser setShouldProcessNamespaces:NO]; 
    [rssParser setShouldReportNamespacePrefixes:NO]; 
    [rssParser setShouldResolveExternalEntities:NO]; 
    [rssParser parse]; 
    [rssParser release]; 

Изображение утечки ....

alt text http://www.shipfinder.co.uk/images/memoryleak.png

+1

Обратите внимание, что три оператора setShould * по умолчанию все равно NO, поэтому вы можете удалить их из своего кода. –

ответ

10

Apple, получили обратно ко мне, и это ошибка # 6469143

Похоже, они планируют исправить на 4,0

+0

У вас был ответ от Apple об этой ошибке? –

+2

Я получаю ту же утечку, что и эта утечка исправлена ​​в 4.0 – kiri

+1

Ну, я все еще вижу это в SDK iOS4. Я еще не скачал последние – philsquared

3

наиболее вероятной причиной является то, что один из ваших методов делегата сохраняет анализатор. Вы делаете что-либо с параметром parser в методах делегата?

Вы получаете утечку при каждом обновлении?

Если это место, где используется rssParser, почему вы делаете его ivar? Если вам нужен ивар, я не могу достаточно подчеркнуть, насколько важно всегда использовать для них аксессуры и никогда не обращаться к ним напрямую. Единственный лучший способ избежать утечек памяти - использовать аксессуар для ваших иваров.

Кроме того, никогда не отпускайте что-то, не устанавливая его на что-то другое (обычно ноль). Ваш выпуск rssParser выше - это сбой, ожидаемый, потому что теперь у вас есть указатель на потенциально нераспределенную память.

+0

Да, я получаю утечку каждый раз, я внес изменения, которые вы описываете, так как да, это не должно быть ivar! Все еще протекает! –

+0

У вас есть Xcode 3.2 (от SnowLeopard)? Инструмент «Сборка и анализ» очень хорош в поиске простых утечек. –

+0

Да, я уже пробовал это. –

0

Кажется, это хорошо известная проблема. См. Здесь NSURLConnection leaking. Однако, если вы установите следующее перед инициализацией парсер протечки останавливается:

[[NSURLCache sharedURLCache] setMemoryCapacity:0]; 
[[NSURLCache sharedURLCache] setDiskCapacity:0]; 
NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:URL]; 
+0

На самом деле Apple вернулась ко мне, и эта проблема уже зарегистрирована как 6469143. Не знаю, когда они это исправит. Все еще течет, переходя к вашему способу делать это тоже! –

0

Я просто исправил это, используя метод, описанный в this post.

Это обходной путь, но он работает.

В другом примечании я обнаружил, что инструменты надежно работают в Lion/Xcode 4.1, если вы всегда запускаете его на устройстве, в отличие от симулятора. На симуляторе, похоже, есть дьявол времени, связанного с процессом.

Реализация NSXMLParser кажется естественной утечкой. Есть еще одна утечка из этой библиотеки в другом месте в моем приложении, что мне нужно посмотреть, могу ли я прикрепить ее. Это асинхронный вызов, и это решение, похоже, не работает для этого.

 Смежные вопросы

  • Нет связанных вопросов^_^