5

Digamos que tengo un objeto llamado "foo" con otro objeto llamado "barra" como propiedad.Objective-C: ¿Tiene que desasignar objetos de propiedad antes de desasignar el objeto primario?

Cuando se desasigna "foo", ¿eliminará automáticamente todas las referencias a "bar" para que también se desasigne "barra"? o "foo" desasignar y "barra" flotar en la memoria en alguna parte? incluso si todas las referencias de "barra" están definidas en "foo".

gracias de antemano.

Respuesta

15

Si el objeto tiene foo cualquier conserva o copias de (gracias a Dave) bar, por ejemplo cuando se declara la propiedad ya sea como uno de estos:

@property (nonatomic, retain) NSString *bar; 
// Or 
@property (nonatomic, copy) NSString *bar; 

que necesitará para liberar bar cuando desasignar foo:

- (void)dealloc 
{ 
    [bar release]; 

    [super dealloc]; 
} 

El sistema no libre bar 's espacio de memoria para usted hasta que deshacerse de todas las referencias a ella (es decir, el contador de referencia baja a 0) por lo que, tendrá que controlar sus recuentos y objetos de referencia usted mismo.

+2

+1 también debe liberar si la propiedad se declara como 'copia'. –

2

Si asigna memoria, debe liberarla. Entonces, sí, llame al [bar release] o self.bar = nil (si usa propiedades sintetizadas y todo eso) en su dealloc.

See here para una introducción a la gestión de memoria en iOS.

+1

'bar = nil' no lo cortará, necesitará usar' self.bar = nil' o '[self setBar: nil] 'para liberar realmente el objeto de destino. Sin embargo, es una mala idea llamar a los métodos en 'self' en' -dealloc', así que llame a '[bar release]' en su lugar. –

+0

Sí, lo siento, tienes razón, 'self.bar = nil'. Los documentos de Apple y el código de muestra a menudo hacen 'self.prop = nil' ... Pero estoy de acuerdo en su mayoría. – rfunduk

0

El objeto A es responsable de liberar cualquier referencia a otros objetos (Objeto B, Objeto C, etc.) cuando se desasigna, esto no sucede automáticamente.

Esto se hace en el método -dealloc en el objeto:

- (void)dealloc 
{ 
    [propertyB release]; 
    [propertyC release]; 
    [super dealloc]; 
} 

(o si se leen las propiedades/escritura y maked como retain, puede sustituir [self setPropertyB:nil], etc).

Entonces, lo que sucederá es que cuando todas las referencias al objeto A desaparecen, se desasignan, reduciendo a su vez el recuento de referencias en las propiedades B y C. Si esos objetos solo son propiedad del objeto A, también terminarán siendo desasignado como resultado.

(Esto es cierto para todo el desarrollo de SO de iPhone que haya etiquetado. Supongo que no está hablando del entorno de recolección de basura en la Mac, que tiene reglas y comportamientos diferentes y hace algunas cosas automáticamente).

0

La razón principal para estar usando self.bar = nil sería si la barra fuera una referencia a una vista que se creó dentro de un archivo nib. En ese caso, se incluiría esa línea en -(void)viewDidUnload, ya que esto permitirá que el sistema lance ese objeto cuando se desplace la vista. Si la vista vuelve, se volverá a cargar a través del archivo de punta. Sin embargo, esto no evita que necesite usar 'self.bar = nil o [bar release] en -(void) dealloc

Cuestiones relacionadas