Aquí está el código al que me refiero.¿Qué aumenta el recuento de retención de un objeto?
// Person.h
@interface Person : NSObject {
NSString *firstName;
NSString *lastName;
}
@end
// Person.m
@implementation Person
- (id)init {
if (![super init]) return nil;
firstName = @"John";
lastName = @"Doe";
}
@end
// MyClass.m
@implementation MyClass
.....
- (NSArray *)getPeople {
NSMutableArray *array = [[NSMutableArray alloc] init];
int i;
for (i = 0; i < 10; i++) {
Person *p = [[Person alloc] init];
[array addObject:p];
}
return array;
}
.....
@end
Ahora, sé que no hay administración de memoria en este código de muestra. ¿Qué se requeriría?
En el bucle getPeople, estoy asignando una Persona (retainCount 1), y luego lo agrego a la matriz. El conteo de retención ahora es 2, ¿verdad? Si es dos, ¿debería estar [p release]'ing después de agregarlo a la matriz, con lo que retomar reutilizar a 1?
¿Tengo razón en que es responsabilidad del que llama liberar la matriz devuelta por el método? (Que también liberaría la memoria de la Persona, y sus variables de instancia, asumiendo que sus recuentos están en 1).
He leído el documento de administración de memoria de Apple, pero supongo que lo que no tengo claro es qué es lo que aumenta la retención de un objeto? Aunque creo que capto la idea de quién es la responsabilidad de liberar. Esta es la regla fundamental, según Apple:
tomar posesión de un objeto si se crea empleando un método cuyo nombre comienza con “alloc” o “nuevo” o contiene “copia” (por ejemplo, alloc , newObject o mutableCopy), o si le envía un mensaje de retención. Usted es responsable de renunciar a la propiedad de los objetos que posee mediante el lanzamiento o la liberación automática. En cualquier otro momento que reciba un objeto, no debe liberarlo.
frase de bobDevil "solo preocúpate por los conteos de retención que agregas al elemento de forma explícita" haz clic para mí. Después de leer la política de Propiedad en Apple, esencialmente, el objeto/método que creó el nuevo objeto, es el responsable de liberarlo/interesarlo. ¿Es esto correcto?
Ahora, supongamos que un método, que recibe un objeto y lo asigna a una variable de instancia. Necesito retener el objeto recibido correcto, ya que todavía tengo un interés en él?
Si algo de esto es incorrecto, házmelo saber.
Josh dice que NSMutableArray está marcado para su liberación automática por defecto? –
Tiene que liberar automáticamente de forma automática un objeto que cree. – mjhoy