Wyciek NSXMLParser

Mam następujący kod, który wycieka. Instrumenty mówią, że to obiekt rssParser przecieka. "Odświeżam" kanał XML i uruchamia blok i przecieka....

Plik.h

@interface TestAppDelegate : NSObject <UIApplicationDelegate> {

    NSXMLParser *rssParser;

}

Plik.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];

Obraz wycieku....

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

Author: Lee Armstrong, 2009-10-21

4 answers

Apple wróciło do mnie i to jest błąd # 6469143

Wygląda na to, że planują naprawić 4.0

 10
Author: Lee Armstrong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 06:44:07

Najbardziej prawdopodobną przyczyną jest to, że jedna z metod delegata zachowuje parser. Czy robisz coś z parametrem parsera w metodzie delegate?

Czy dostajesz przeciek za każdym razem, gdy odświeżasz?

Jeśli jest to jedyne miejsce, gdzie rssParser jest używany, dlaczego robisz z niego ivar? Jeśli potrzebujesz ivar, nie mogę wystarczająco podkreślić, jak ważne jest, aby zawsze używać dla nich accessorów i nigdy nie uzyskiwać do nich bezpośredniego dostępu. Najlepszym sposobem na uniknięcie wycieków pamięci jest użycie accesorów dla Twoich ivarów.

Również nigdy nie wypuszczaj czegoś bez natychmiastowego ustawienia go na coś innego (Zwykle zero). Twoje wydanie rssParser powyżej jest awarią, która czeka, ponieważ masz teraz wskaźnik do potencjalnie nieprzydzielonej pamięci.

 3
Author: Rob Napier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-21 07:00:08

Wygląda na to, że to dobrze znany problem. Zobacz tutaj nsurlconnection leaking . Jeśli jednak ustawisz następujące ustawienia przed zainicjowaniem przestaje wyciekać parser:

[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:URL];
 0
Author: leviathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-09 17:50:50

Naprawiłem to za pomocą metody opisanej w Ten post.

To obejście, ale działa.

Z innej uwagi, odkryłem, że instrumenty działa niezawodnie w Lion / Xcode 4.1, jeśli zawsze uruchomić go na urządzeniu, w przeciwieństwie do symulatora. Na symulatorze, wydaje się, że diabeł czasu przywiązuje się do procesu.

Implementacja NSXMLParser wydaje się być naturalnie wyciekająca. Kolejny przeciek pochodzi z tej biblioteki gdzie indziej w mojej aplikacji muszę sprawdzić, czy uda mi się to ustalić. To jest asynchroniczne połączenie, a to rozwiązanie nie wydaje się działać na to.

 0
Author: Little Green Viper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-19 12:20:35