Pregunta

Estoy empezando a comprender mejor la gestión de la memoria en el objetivo-c, pero hay algo que no entiendo. Esta es una declaración de propiedad:

@property (nonatomic, retain)UILabel *myLabel;

y este es su setter sintetizado invisible (creo):

- (void)setMyLabel:(UILabel *)newValue {
    if(myLabel != newValue) {
        [myLabel release];
        myLabel = [newValue retain];
    }
}

Lo que le ahorra todo el trabajo de retención y cosas cada vez, pero digamos que configuré mi propiedad por primera vez, aún no se ha asignado, por lo que su recuento de referencia es 0, ¿verdad? Entonces lo hago

UILabel *tempLabel = [[UILabel alloc] init];
self.myLabel = tempLabel;
[tempLabel release];

No estoy realmente seguro de lo que sucede allí, cuando no publica nada, pero digamos que la propiedad ya tiene un valor, y lo configuramos. En el setter, primero se libera. Entonces, ¿eso no lo hace desaparecer? Si su recuento de referencia es uno, y luego en el setter se libera, ¿cómo se queda para establecer el nuevo valor retenido?

¡Gracias!

¿Fue útil?

Solución

Creo que estás confundiendo objetos y referencias. Una propiedad es una referencia a un objeto, no el objeto en sí. Cuando establece o desactiva una propiedad, envía retenciones y liberaciones a los objetos a los que apunta, pero la referencia en sí misma es parte del objeto en el que se encuentra la propiedad (en este caso, auto).

Puede ser útil leer sobre cosas como punteros y lvalues ??.

Otros consejos

El valor inicial de myLabel es nulo, por lo que su primera asignación a la propiedad, es decir,

self.myLabel = tempLabel;

lanzará nil, es decir, [nil release]. En el Objetivo C, enviar un mensaje a nil no es una opción, por lo que esto no hará nada.

Del mismo modo, en su método dealloc, debería tener:

[myLabel release];

Que liberará myLabel si la propiedad se ha asignado alguna vez, equilibrando el [newValue retención] en el setter. Si la propiedad nunca se ha asignado, seguirá siendo nula y, de nuevo, la [liberación nula] no será operativa.

Lea las reglas de administración de memoria para las reglas exactas sobre cuándo necesita retener / liberar objetos.

El objeto " desaparecerá " (es decir, ser desasignado) cuando todas las propiedades en él han sido cedidas. Es decir, cuando (o poco después) todas las llamadas de asignación / copia / nuevas se han equilibrado con las llamadas de liberación / liberación automática.

También soy relativamente nuevo en Objective-C, pero me gustaría intentar responder a esto para reafirmar mi comprensión.

  

digamos que configuré mi propiedad por primera vez, aún no se ha asignado, por lo que su recuento de referencia es 0, ¿verdad?

Sí, el recuento de retención es 0.

  

En el setter, primero se libera. Entonces, ¿eso no lo hace desaparecer?

Resta 1 del conteo retenido de myLabel . Si el recuento de retención de myLabel llega a 0, los datos u objetos a los que apunta la variable myLabel se liberarán de la memoria.

  

Si su recuento de referencia es uno, y luego en el setter se libera, ¿cómo se queda para establecer el nuevo valor retenido?

En ese escenario, los datos a los que apunta myLabel se liberarán (el recuento de retención será 0) y myLabel apuntará a nulo (está vacío). La variable se establece en la clase y siempre estará disponible para aceptar mensajes en ese setter, por lo que los nuevos datos se pueden asignar a myLabel si el recuento de retención de myLabel es 0 o 100.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top