2010-03-12 26 views
14

Me preguntaba si necesito liberar un NSObject copiado? Por ejemplo, puedo crear un único diccionario que copio en una matriz:¿Necesito liberar un NSObjects copiado - Objective-c

Código:

for (int num = 0; num < [object count]; num++) { 
    [dictionary setObject:[object objectAtIndex:num] forKey:@"x"]; 
    [array addObject:[dictionary copy]]; 
} 

¿Tengo que liberar el diccionario? ¿Si sí, cuándo?

Gracias

+0

+1 buena pregunta – andy

+3

Como regla general, en Cocoa tienes que publicar todo lo que tienes. Usted posee algo si lo envió con nuevo, copia, alloc o retener. Si no llamó a uno de esos métodos, no lo posee y no debe liberarlo. –

Respuesta

24

Sí, lo hace. En este caso, probablemente debería liberar la copia inmediatamente después de añadir a la matriz, porque la matriz retiene nada añadido a la misma:

NSDictionary *copied = [dictionary copy]; 
[array addObject:copied]; 
[copied release]; 
+0

¡Gracias por la información! – ncohen

4

Este fragmento de documentación:

- (id) copiar

Valor de retorno El objeto devuelto por el método de protocolo NSCopying copyWithZone :, donde la zona es nula.

Discusión Este es un método práctico para las clases que adoptan el protocolo NSCopying. Se genera una excepción si no hay implementación para copyWithZone :.

NSObject no es compatible con el protocolo NSCopying. Las subclases deben admitir el protocolo e implementar el método copyWithZone: Una versión de subclase del método copyWithZone: debe enviar el mensaje al súper primero, para incorporar su implementación, a menos que la subclase desciende directamente de NSObject.

Consideraciones especiales Si está utilizando la memoria administrada (no la recolección de basura), este método conserva el nuevo objeto antes de devolverlo. El invocador del método, sin embargo, es responsable de liberar el objeto devuelto.

0

Es difícil de decir, sin ver dónde se crea el diccionario, si esto es sensato de todos modos. Si no hay otros miembros en el diccionario, sería más sencillo (aunque posiblemente más difícil de leer :) hacer algo como

for (int num = 0; num < [object count]; num++) { 
    [array addObject:[NSDictionary 
          dictionaryWithObject:[object objectAtIndex:num] 
             forKey:@"x" 
        ] 
    ] 
} 

Eso va a darle objetos reales NSDictionary en su conjunto, en lugar de la NSMutableDictionary copias que estás creando

+0

¿Con qué fundamento afirmas que una copia de un NSMutableDictionary no sería un "NSDictionary * * real"? –

+0

Sobre la base de que un NSDictionary * real arrojará errores si intenta insertar objetos en él. – Jeff

Cuestiones relacionadas