miércoles, 14 de julio de 2010

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

No hay comentarios.:

Publicar un comentario