NSXMLParser Leaking

Tengo el siguiente código que se filtra. Instruments dice que es el objeto rssParser el que está goteando. “Actualizo” el feed XML y ejecuta el bloque y se filtra …

file.h

@interface TestAppDelegate : NSObject  { 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]; 

Imagen de fuga …

texto alternativo http://sofes.miximages.com/iphone/404.html

Apple me ha respondido y este es un error # 6469143

Parece que planean arreglar para 4.0

La causa más probable es que uno de sus métodos de delegado retiene el analizador. ¿Haces algo con tu parámetro analizador en los métodos delegates?

¿Tienes una fuga cada vez que actualizas?

Si este es el único lugar donde se usa rssParser, ¿por qué lo hace un ivar? Si necesitas un ivar, no puedo enfatizar lo importante que es usar siempre los accesorios para ellos y nunca acceder a ellos directamente. La mejor forma de evitar memory leaks es utilizar accesos para sus ivars.

Además, nunca suelte algo sin configurarlo de inmediato (generalmente nulo). Su lanzamiento de rssParser anterior es un locking que está por ocurrir porque ahora tiene un puntero a la memoria potencialmente no asignada.

Parece que este es un problema bien conocido. Mira aquí NSURLConección que se escapa . Sin embargo, si configura lo siguiente antes de inicializar, el analizador deja de tener fugas:

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

Lo solucioné usando el método descrito en esta publicación .

Es una solución, pero funciona.

En otra nota, he encontrado que Instruments funciona de manera confiable en Lion / Xcode 4.1 si siempre lo ejecuta en el dispositivo, a diferencia del simulador. En el simulador, parece tener un demonio de un tiempo asociado al proceso.

La implementación NSXMLParser parece tener una fuga natural. Hay otra filtración proveniente de esta biblioteca en otra parte de mi aplicación que necesito ver si puedo localizarla. Esa es una llamada asincrónica, y esta solución no parece funcionar para eso.