@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é?
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.
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]