web-dev-qa-db-ja.com

アークでセッターをオーバーライドする

@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

ARCが有効なときにセッターを正しくオーバーライドしましたか?

108
rowwingman

はい、これは正しいです。また、これが実際に正しいことだと信じるのにしばらく時間がかかりました。

この場合、標準の生成されたセッターが行うよりも多くのことをしないので、オーバーライドは不要であることを理解していますか?さらにコードをsetImageURLString:に追加する場合にのみ、セッターをオーバーライドする必要があります。

89
Pascal

@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関連の質問に自分で答える方法を示すことは有益だと思いました]

68
mattjgalloway