Remplacer le poseur avec arc

108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

Ai-je correctement remplacé le setter lorsque l'ARC est activé?

rameur
la source
2
Oui, cela me semble correct. Cela fonctionne-t-il comme vous vous y attendez ou non?
Robin Summerhill

Réponses:

89

Oui, c'est correct. Il m'a également fallu un certain temps pour croire que c'est effectivement la bonne chose à faire.

Vous vous rendez compte que dans ce cas, le remplacement n'est pas nécessaire car vous ne faites pas plus que ne le ferait le setter standard généré? Ce n'est que si vous ajoutez plus de code setImageURLString:que vous devrez remplacer le setter.

Pascal
la source
6
Oui. Je m'en rends compte. J'ajoute un commentaire où je veux ajouter mon code supplémentaire. Merci beaucoup pour la réponse.
rowwingman
4
Vous savez ce qui serait une expérience intéressante? Changer la couleur des commentaires (dans SO et autres sites et IDE) ... généralement, c'est gris clair ou quelque chose qui ne se démarque pas. # ff0000 peut-être? Cela ferait-il une différence? En tant que programmeurs, nous sommes habitués à ignorer les commentaires à moins que nous essayions spécifiquement de déduire comment quelque chose fonctionne, auquel cas nous les ignorons aussi parfois.
maltalef
68

En développant la réponse donnée par @Pascal, j'aimerais simplement ajouter que c'est définitivement la bonne chose à faire et que vous pouvez vérifier en voyant ce que le code compile. J'ai écrit un article de blog sur la façon de vérifier, mais fondamentalement, ce code se compile 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}

Notez l'appel _objc_storeStrongauquel selon LLVM fait ceci:

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

Donc, pour répondre à votre question, oui c'est vrai. ARC a ajouté la version correcte de l'ancienne valeur et la conservation de la nouvelle valeur.

[Probablement une réponse compliquée, mais j'ai pensé qu'il était utile de montrer comment vous pouvez répondre à ce type de question liée à l'ARC à l'avenir]

mattjgalloway
la source
1
Merci pour cela, je remettais en question mon code (et cette réponse) mais vous avez apaisé mes craintes.
evanflash
1
Merci Matt. Cela ne me semblait pas normal d'être le 43e électeur, car 42 semblaient un total de votes si approprié pour cette réponse.
bmauter
1
Et si la propriété est définie pour copier? Par exemple @ propriété (non atomique, copie) UIColor * lineColor ;. À l'intérieur du setter, puis-je simplement faire _lineColor = input; ou dois-je faire _lineColor = [copie d'entrée] ;?
Daniel T.
1
@DanielT. vous devez faire _lineColor = [input copy];, oui.
mattjgalloway
-10

Appel

[super setImageURLString:theString];

C'est tout

Raulcatena
la source
1
la superclasse n'aura probablement pas d'implémentation de setImageURLString:
Wil Macaulay
Même si c'était le cas, cela ferait probablement des choses que vous ne voulez pas qu'il fasse.
Nate Symer