2010-08-23 16 views
12

Ayúdeme con esta pérdida de memoria. En la herramienta de fugas muestra una fuga: NSCFString (32 bytes) en la biblioteca Foundation Encargo responsable: NSPropertyListSerialization. Estoy liberando el error, pero aún tengo una filtración. ¿Qué me estoy perdiendo? ¡Muchas gracias!Pérdida de memoria con Serialización Plist

NSPropertyListFormat format; 
    NSString *anError = nil; 
    id plist; 
    plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError]; 
    if (!plist){ 
      [anError release]; 
    } 
    NSArray *entries = (NSArray *)plist; 
    for (NSDictionary *entry in entries) 
    { 
     // DO SOMETHING 
    } 
+2

Hay varios mensajes sobre este por ahí diciendo que es un error de manzana, algunos dicen utilizar opciones NSPropertyListSerialization: Formato: error y otros dicen que cambie a la serialización JSON , pero aún no he encontrado una buena respuesta. –

+5

Veo un error: no debe hacer '[anError release]' en su código; usted no posee la referencia a 'anError'. 'propertyListFromData:' lo habrá liberado automáticamente antes de volver a su código. Sin embargo, este es un error * double-free *, no * leak *. No veo ninguna fuga en el código que publicaste. – Quuxplusone

+0

En el depurador, po el valor de la cadena que se está filtrando para ver si le da alguna pista. –

Respuesta

0

La declaración plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError]; crea un objeto autorelease. Si su código ahora se ejecuta en un hilo separado al que no se ha asignado explícitamente el grupo de autorretención por @autoreleasepool {...}, este objeto nunca se puede liberar y será una pérdida.
Por lo tanto, asegúrese de haber configurado un grupo de autorrelease si su código se ejecuta en un hilo separado.

1

En primer lugar, asegúrese de no estar utilizando llamadas a métodos en desuso u obsoletas. Dependiendo de la configuración de su aplicación (esto es para que usted decida), puede estar usando llamadas a métodos obsoletos; de documentos de Apple:

propertyListFromData:mutabilityOption:format:errorDescription: 

This method is obsolete and will be deprecated soon. (Deprecated. Use propertyListWithData:options:format:error: instead.)

que no detectó una pérdida de memoria después de utilizar la API de llamada recomendado ... Código de prueba:

NSArray *somearray = @[@"One",@"Two",@"Three"]; 
NSData *rawCourseArray = [NSKeyedArchiver archivedDataWithRootObject:somearray]; 

NSPropertyListFormat format; 
NSError *anError = nil; 
id plist; 
plist = [NSPropertyListSerialization propertyListWithData:rawCourseArray options:NSPropertyListImmutable format:&format error:&anError]; 
if (!plist){ 
    [anError release]; 
} 
NSArray *entries = (NSArray *)plist; 
for (NSDictionary *entry in entries) 
{ 
    // DO SOMETHING 
    NSLog(@"%@",entry); 
} 
+0

+1 Por notar el método obsoleto, que realmente puede ser el problema. Pero, elimine la línea '[error release]', muchas gracias;) – Tricertops

+0

'propertyListWithData: options: format: error:' también tiene una fuga. – Leandros

0

hacer esto mediante el que obtenemos en el diccionario de temperatura

NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
    NSString *errorDesc = nil; 
    NSPropertyListFormat format; 
    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; 
    if (!temp) 
    { 
     NSLog(@"Error reading plist: %@, format: %d", errorDesc, format); 
    } 
0

no hay fugas. envuélvalo todo en @autoreleasepool para asegurarse de que todo lo que se libera automáticamente desaparezca inmediatamente como una prueba.

ENTONCES elimine ese posible bloqueo causado por el doble sin error: se libera automáticamente y no tiene que volver a lanzarlo.

0

tratar de leer su plist de esta manera:

NSDictionary *dTmp=[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"]]; 


self.myarray=[dTmp valueForKey:@"Objects"];