Propiedades en Objective-C y el manejo de memoria

Hace unos días comentaba sobre el manejo de memoria en Objective-C.

Hoy quería hablar en particular sobre las propiedades.

Cuando un declara un propiedad en una clase,  con la directiva @property, el setter de dicha propiedad puede tener una de las siguiente semánticas:

  • assign: se usa una asignación simple, es el valor por defecto
  • retain: se le envía un mensaje de "retain" al valor que se va a asignar a la propiedad
  • copy: se le envía un mensaje de "copy" (se crea una copia) al valor que se va a asignar.
Cuando se va a implementar el método setter (si no se usa la directiva @synthesize para que lo cree por defecto) se debe tener en cuenta la semántica que se le quiere dar a dicha propiedad.

Assign

Supongamos que tenemos una propiedad definida como 
@property (nonatomic, assign) NSObject *myProperty;
El método setter de dicha propiedad deberá ser de la siguiente forma:
- (void) setMyProperty:(NSObject *)valor {
    myProperty = valor;
    // custom implementation
}
Retain

Si en cambio la propiedad está definida como
@property (nonatomic, retain) NSObject *myProperty;
Entonces el método setter deberá ser:
- (void) setMyProperty:(NSObject *)valor {
    if (myProperty)
        [myProperty release];
    myProperty = [valor retain];
    // custom implementation
}
Copy

Por último, si la propiedad se declara como
@property (nonatomic, copy) NSObject *myProperty;
El método setter deberá ser:
- (void) setMyProperty:(NSObject *)valor {
    if (myProperty)
        [myProperty release];
    myProperty = [valor copy];
    // custom implementation
}
Método dealloc

En el caso que se haya declarado la propiedad como retain o como copy, en el método dealloc se debe liberar la memoria con
[myProperty release];
Esto no se debe hacer en el caso que la propiedad sea de tipo assign

Comentarios

Entradas más populares de este blog

Subversion vs. Git

No hemos cambiado nada

Literales de tipo Date y DateTime en GeneXus