2009-10-21 5 views
9

Ho il seguente codice che perde. Gli strumenti dicono che è l'oggetto rssParser che perde. I "rinfrescare" il feed XML e funziona il blocco e di perdite ....Perdita NSXMLParser

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

Immagine di fuga ....

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

+1

Si noti che le tre istruzioni setShould * sono tutte predefinite su NO in modo da poterle eliminare dal codice. –

risposta

10

Apple hanno avuto verso di me e questo è un bug # 6469143

Sembra che prevede di risolvere per 4,0

+0

Hai avuto qualche risposta da Apple su questo Bug? –

+2

Sto ottenendo la stessa perdita questa perdita è stata risolta in 4.0 – kiri

+1

Beh, la vedo ancora nell'SDK di iOS4. Non ho ancora scaricato l'ultimo – philsquared

3

la causa più probabile è che uno dei tuoi metodi delegato mantiene il parser. Fai qualcosa con il tuo parametro parser nei metodi delegati?

Si verifica una perdita ogni volta che si aggiorna?

Se questo è l'unico posto in cui viene usato rssParser, perché lo stai facendo diventare un ivar? Se hai bisogno di un ivar, non posso sottolineare abbastanza quanto sia importante utilizzare sempre gli accessor per loro e non accedervi mai direttamente. L'unico modo migliore per evitare perdite di memoria è utilizzare gli accessor per i tuoi ivars.

Inoltre, non rilasciare mai qualcosa senza impostarlo immediatamente su qualcos'altro (solitamente nulla). Il tuo rilascio di rssParser sopra è un arresto anomalo in attesa che si verifichi perché ora hai un puntatore alla memoria potenzialmente non allocata.

+0

Sì, ogni volta ricevo una perdita, ho fatto le modifiche che descrivi come si, non dovrebbe essere un ivar! Ancora perde! –

+0

Hai Xcode 3.2 (da SnowLeopard)? Lo strumento Build and Analyze è molto bravo a trovare semplici fughe. –

+0

Sì, l'ho già provato. –

0

Sembra che questo sia un problema ben noto. Vedi qui NSURLConnection leaking. Tuttavia, se si imposta la seguente prima di inizializzare la fuoriuscita parser ferma:

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

In realtà Apple mi ha richiamato e questo problema è già registrato come 6469143. Non sono sicuro quando lo ripareranno. Ancora delle falle che cambiano nel tuo modo di farlo anche tu! –

0

Ho appena risolto questo problema utilizzando il metodo descritto in this post.

È una soluzione, ma funziona.

In un'altra nota, ho trovato che gli strumenti funzionano in modo affidabile in Lion/Xcode 4.1 se lo si esegue sempre sul dispositivo, al contrario del simulatore. Sul simulatore, sembra avere un diavolo di tempo legato al processo.

L'implementazione NSXMLParser sembra fuoriuscire naturalmente. C'è un'altra perdita proveniente da questa libreria altrove nella mia app che ho bisogno di vedere se riesco a fissare. Questa è una chiamata asincrona, e questa soluzione non sembra funzionare per quello.