objective-c serialization memory-leaks property-list

objective c - Fuga de memoria con serialización Plist



objective-c serialization (5)

Intenta leer tu plist de esta manera:

NSDictionary *dTmp=[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"]]; self.myarray=[dTmp valueForKey:@"Objects"];

Por favor, ayúdame con esta fuga de memoria. En la herramienta de fugas, muestra una fuga: NSCFString (32 bytes) en la biblioteca Foundation Marco responsable de la base de datos: NSPropertyListSerialization . Estoy liberando el error, pero aún tengo una filtración. ¿Qué me estoy perdiendo? ¡Muchas gracias!

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 }


La instrucción plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError]; crea un objeto de liberación automática Si su código ahora se ejecuta en un hilo separado al que ningún pool de autorrelease ha sido asignado explícitamente por @autoreleasepool {...} , este objeto nunca podrá ser liberado y será una fuga.
Por lo tanto, asegúrese de haber configurado un grupo de autorrelease si su código se ejecuta en un hilo separado.


Pruebe esto por obtener el diccionario en temp

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); }


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, deshazte de ese posible bloqueo causado por el doble sin error: ¡se libera automáticamente y no tienes que volver a lanzarlo!


En primer lugar, asegúrese de no utilizar 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 los documentos de Apple:

propertyListFromData:mutabilityOption:format:errorDescription:

Este método está obsoleto y se dejará de usar pronto. ( Obsoleto. Use propertyListWithData:options:format:error: lugar).

No detecté una pérdida de memoria después de usar la llamada api recomendada ... 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); }