Anular el colocador con arco

108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

- (void)setImageURLString:(NSString *)imageURLString {
    _imageURLString = imageURLString;
    //do something else
}

¿Anulé correctamente el configurador cuando ARC está habilitado?

Rowwingman
fuente
2
Sí, esto me parece correcto. ¿Funciona como esperas o no?
Robin Summerhill

Respuestas:

89

Si eso es correcto. También me tomó un tiempo confiar en que esto es lo correcto.

¿Se da cuenta de que en este caso, la anulación no es necesaria ya que no hace más de lo que haría el establecedor generado estándar? Solo si agrega más código setImageURLString:, necesitará anular el establecedor.

Pascal
fuente
6
Si. Me doy cuenta de esto. Agrego un comentario donde quiero agregar mi código adicional. Muchas gracias por la respuesta.
rowwingman
4
¿Sabes cuál sería un experimento interesante? Cambiar el color del comentario (en SO y otros sitios e IDE) ... generalmente es gris claro o algo que no se destaca. # ff0000 tal vez? ¿Habría alguna diferencia? Nosotros, como programadores, estamos acostumbrados a ignorar los comentarios a menos que estemos específicamente tratando de deducir cómo funciona algo, en cuyo caso también los ignoramos a veces.
maltalef
68

Ampliando la respuesta dada por @Pascal, solo me gustaría agregar que definitivamente es lo correcto y puede verificar viendo en qué se compila el código. Escribí una publicación de blog sobre cómo realizar la verificación, pero básicamente ese código se compila en (ARMv7):

        .align  2
        .code   16
        .thumb_func     "-[Article setImageURLString:]"
"-[Article setImageURLString:]":
        push    {r7, lr}
        movw    r1, :lower16:(_OBJC_IVAR_$_Article._imageURLString-(LPC7_0+4))
        mov     r7, sp
        movt    r1, :upper16:(_OBJC_IVAR_$_Article._imageURLString-(LPC7_0+4))
LPC7_0:
        add     r1, pc
        ldr     r1, [r1]
        add     r0, r1
        mov     r1, r2
        blx     _objc_storeStrong
        pop     {r7, pc}

Tenga en cuenta la llamada a la _objc_storeStrongque según LLVM hace esto:

id objc_storeStrong(id *object, id value) {
    value = [value retain];
    id oldValue = *object;
    *object = value;
    [oldValue release];
    return value;
}

Entonces, para responder a su pregunta, sí, es correcto. ARC ha agregado la liberación correcta del valor anterior y la retención del nuevo valor.

[Probablemente una respuesta demasiado complicada, pero pensé que era útil mostrar cómo puede responder usted mismo a este tipo de preguntas relacionadas con ARC en el futuro]

Mattjgalloway
fuente
1
Gracias por esto, estaba cuestionando mi código (y esta respuesta) pero has disipado mis miedos.
evanflash
1
Gracias Matt. No se sintió bien ser el 43º votante, porque 42 parecía un recuento de votos tan apropiado para esta respuesta.
bmauter
1
¿Qué pasa si la propiedad está configurada para copiar? Por ejemplo @property (nonatomic, copy) UIColor * lineColor ;. Dentro del setter, ¿puedo simplemente hacer _lineColor = input; ¿O tengo que hacer _lineColor = [input copy] ;?
Daniel T.
1
@DanielT. tienes que hacer _lineColor = [input copy];, sí.
mattjgalloway
-10

Llamada

[super setImageURLString:theString];

Eso es

raulcatena
fuente
1
no es probable que la superclase tenga una implementación de setImageURLString:
Wil Macaulay
Incluso si lo hiciera, probablemente haría cosas que no quieres que haga.
Nate Symer