2009-08-08 8 views
5

Memoria problema de pérdida - NSConcreteDatamemoria problema de fugas utilizando NSData en iPhone

// to set tip - photo in photo frame  
NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:pathOfThumbNail]]; 
UIImage *cellThumbImg; 
if([data length]>0){ cellThumbImg=[UIImage imageWithData:data];} else { cellThumbImg=[UIImage imageNamed:@"130X90.gif"]; } 
UIImageView *imgView=[[UIImageView alloc]initWithImage:cellThumbImg]; imgView.frame=photoFrame; 
(cellThumbImg.size.height>=58 || cellThumbImg.size.width>=58) ? [imgView setContentMode:UIViewContentModeScaleToFill] : [imgView setContentMode:UIViewContentModeCenter] ; 
[cell.contentView addSubview:imgView]; 
[imgView release]; 

mi pregunta es muy similar a esta pregunta,

iPhone - Memory Leak - NSData dataWithContentsOfUrl & UIWebView

Incluso, he añadido siguiente código a mi La aplicación finalizó el lanzamiento, que se muestra a continuación. El siguiente código es para configurar memoria de memoria compartida con capacidad cero. Casi eliminará la fuga de NSConcreteData en mi aplicación. Sin embargo, la memoria se filtra.

- (void)applicationDidFinishLaunching:(UIApplication *)application {  
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; 
[NSURLCache setSharedURLCache:sharedCache]; 
[sharedCache release]; 
[window makeKeyAndVisible]; 
} 

No he podido encontrar ninguna solución para este tipo de pregunta desde el desbordamiento de la pila.

Si puede responder, le estaré agradecido.

Gracias de antemano.

+0

He seguido el camino como @Bkaenk & @epatelsaid. Sin embargo, existe el mismo problema, como tiene la siguiente pregunta. http://stackoverflow.com/questions/280053/iphone-memory-leak-nsdata-datawithcontentsofurl-uiwebview –

Respuesta

7

Tuve problemas con esto también en mi proyecto grande. Después de trabajar con un ingeniero de Apple para tratar de localizar las filtraciones, finalmente le preguntó al principal equipo de desarrollo de Apple detrás de NSURLConnection. Básicamente dijeron que hay un caché interno que no es eliminable en absoluto en NSURLConnection y que era un problema conocido.

Así que me puse a buscar alternativas. Encontré ASIHTTPConnection (enlace a continuación) que funciona fuera de CFNetwork. Está diseñado para ser un reemplazo directo para NSURLConnection, además de otras muchas cosas increíbles, como la descarga en disco en lugar de la memoria, la reanudación de descargas, la devolución de llamadas en la barra de progreso, etc.

Lo he usado en todos mis proyectos y nunca he tenido ningún problema o queja. Y, en respuesta a su pregunta, así es como me deshice de esas pérdidas de memoria.

http://allseeing-i.com/ASIHTTPRequest/

+1

Si bien esta es la respuesta aceptada y probablemente resolvió el problema del OP, pasé por alto la solución más simple en la respuesta de epatel. Su respuesta debería ser la aceptada. – coneybeare

4

Su mensaje de publicación se deletrea incorrectamente, usted escribió relaese pero es release. Me imagino que solo es un problema en el código que escribió para esta pregunta.

Segundo. No necesita el primer mensaje de cadena alloc init. Todo lo que necesita es:

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 

Por supuesto, no sé si esa llamada es realmente correcto, pero sí sé que devuelve un objeto NSData de auto-lanzado que significa que su anterior alloc init habría fugas.

+0

@Blaenk - Señor, compruebe la corrección en mi pregunta. Estoy teniendo el mismo problema. Incluso después de aplicar su lógica sugerida, estoy encontrando el mismo problema de pérdida de memoria. –

10

Tiene tres líneas, vamos a romper hacia abajo

1. NSData *imageData = [[NSData alloc] init]; 
2. imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 
3. [imageData release]; 

Línea 1: asignar y init un nuevo NSData. Este NSData tendrá un recuento de referencia de +1

Línea 2: obtenga datos de Internet y colóquelos en un NSData. Esto establece la variable que se utiliza la línea 1 a la nueva NSData (que se establece en AutoRelease) ocultando la NSData alloced y inited en la Línea 1

Línea 3: dará a conocer el NSData recibido en la Línea 2.

usted podría quitar línea 1 y 3, y sólo tiene que añadir la declaración de variables a la línea 2. Debido a que se autoreleased será liberar por la tarde ... eventloop

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 

le sugiero que lea la Gestión memoria secciones here

+0

@ePatel - Señor, consulte la corrección en mi pregunta. Estoy teniendo el mismo problema. Incluso después de aplicar su lógica sugerida, estoy encontrando el mismo problema de pérdida de memoria. –

+0

Nit: la línea 2 oculta el imageData recién asignado/inicializado, creando uno nuevo. –

+0

Soy aparentemente un imbécil, lo siento. Lo busqué en sus comentarios, pero lo perdí, e hice una suposición pobre basada en la pregunta editada ... –

7

Cada vez que utilizamos dataWithContentOfURL tenemos que encerrar con NSAutoReleasePool, como la siguiente:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

// ** Your Operations ** 

NSData *data = [NSData dataWithContentsOfURL:someURL]; 

// ** Your Operation ** 

[data autorelease]; 
[pool release]; 

Esto se aplica incluso para NSURLRequest y NSURLConnection.

El problema es con el compilador en sí mismo y lo anterior es el único método para resolver el problema.

+1

Esta es la respuesta. Estupendo. –

+0

Esto es absolutamente incorrecto. No retuvo el objeto con cualquiera de 'retain',' alloc', 'copy',' mutableCopy', o 'new'. No tiene derecho a 'liberarla automáticamente '. Esto es incorrecto y hará que su programa falle en algún lugar de la línea. – user102008