@interface Article : NSObject
@property (nonatomic, strong) NSString *imageURLString;
@end
@implementation Class
@synthesize imageURLString = _imageURLString;
- (void)setImageURLString:(NSString *)imageURLString {
_imageURLString = imageURLString;
//do something else
}
ARCが有効なときにセッターを正しくオーバーライドしましたか?
はい、これは正しいです。また、これが実際に正しいことだと信じるのにしばらく時間がかかりました。
この場合、標準の生成されたセッターが行うよりも多くのことをしないので、オーバーライドは不要であることを理解していますか?さらにコードをsetImageURLString:
に追加する場合にのみ、セッターをオーバーライドする必要があります。
@Pascalによって与えられた答えを拡張して、それが間違いなく正しいことであり、コードが何にコンパイルされるかを確認することで確認できることを付け加えたいと思います。私は ブログ投稿 をチェックする方法について書きましたが、基本的にそのコードは(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}
_objc_storeStrong
の呼び出しに注意してください。これは LLVMによると がこれを行います:
id objc_storeStrong(id *object, id value) {
value = [value retain];
id oldValue = *object;
*object = value;
[oldValue release];
return value;
}
それで、あなたの質問に答えるために、はい、そうです。 ARCは、古い値の正しいリリースで追加し、新しい値を保持します。
[おそらく複雑な答えについてですが、将来この種のARC関連の質問に自分で答える方法を示すことは有益だと思いました]