Propiedades en Objective-C y el manejo de memoria
Hace unos días comentaba sobre el manejo de memoria en Objective-C.
Por último, si la propiedad se declara como
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:
Si en cambio la propiedad está definida como
- (void) setMyProperty:(NSObject *)valor {Retain
myProperty = valor;
// custom implementation
}
Si en cambio la propiedad está definida como
@property (nonatomic, retain) NSObject *myProperty;Entonces el método setter deberá ser:
- (void) setMyProperty:(NSObject *)valor {Copy
if (myProperty)
[myProperty release];
myProperty = [valor retain];
// custom implementation
}
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
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
Publicar un comentario