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?


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.


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]


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.