web-dev-qa-db-fra.com

Ignorer le setter avec arc

@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 remplacé correctement le setter lorsque ARC est activé?

108
rowwingman

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 le setter généré standard ne le ferait? Uniquement si vous ajoutez plus de code à setImageURLString: auriez-vous besoin de remplacer le setter.

89
Pascal

En développant la réponse donnée par @Pascal, je voudrais juste ajouter que c'est certainement la bonne chose à faire et 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 en gros, 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_storeStrong qui 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 conservé la nouvelle valeur.

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

68
mattjgalloway