108 votes

Remplacer le setter par un 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 correctement remplacé le setter lorsque l'ARC est activé ?

89voto

Pascal Points 8222

Oui, c'est exact. Il m'a également fallu un certain temps pour me convaincre que c'était effectivement la bonne chose à faire.

Vous réalisez que dans ce cas, la surcharge n'est pas nécessaire puisque vous ne faites rien de plus que ce que ferait le setter généré standard ? Seulement si vous ajoutez plus de code à setImageURLString: vous devriez remplacer le setter.

68voto

mattjgalloway Points 24217

En développant la réponse donnée par @Pascal, je voudrais juste ajouter que c'est certainement 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 procéder à la vérification, 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 exact. ARC a ajouté la libération correcte de l'ancienne valeur et la conservation de la nouvelle valeur.

[Réponse probablement trop compliquée, mais j'ai pensé qu'il était utile de montrer comment vous pouvez répondre à ce genre de questions liées à l'ARC pour vous-même à l'avenir].

-10voto

raulcatena Points 1

Appeler

[super setImageURLString:theString];

C'est tout

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X