弧でセッターをオーバーライド


108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

ARCが有効な場合、セッターを正しくオーバーライドしましたか?


2
はい、これは私には正しいようです。期待どおりに機能しているかどうか。
Robin Summerhill、2011年

回答:


89

はい、そうです。また、これが本当に正しいことであると信じるのにしばらく時間がかかりました。

この場合、標準で生成されたセッターが実行する以上のことをしないので、オーバーライドは必要ないことに気づいていますか?さらにコードを追加する場合のみsetImageURLString:、セッターをオーバーライドする必要があります。


6
はい。私はこれを理解しています。追加コードを追加する場所にコメントを追加します。返信ありがとうございます。
rowwingman '29年

4
面白い実験になると思いますか?コメントの色を変更する(SOや他のサイトやIDEで)...通常は薄い灰色か目立たないものです。#ff0000多分?違いはありますか?私たちはプログラマーとして、何かがどのように機能するかを明確に推測しようとしない限り、コメントを無視するのに慣れています。
マルタレフ2012年

68

@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}

LLVMによる_objc_storeStrongこれを行う呼び出しに注意してください。

id objc_storeStrong(id *object, id value) {
    value = [value retain];
    id oldValue = *object;
    *object = value;
    [oldValue release];
    return value;
}

だから、あなたの質問に答えるには、そうです。ARCは古い値の正しいリリースを追加し、新しい値を保持しています。

[おそらく複雑な答えですが、将来このようなARC関連の質問に自分で答えるにはどうしたらよいかを示すのに役立つと思いました]


1
このおかげで、私は自分のコード(およびこの答え)を2番目に推測していましたが、あなたは私の恐れを静めてしまいました。
evanflash

1
マットに感謝します。42人がこの回答にふさわしい票のように思えたため、43人目の有権者であるとは正しくないと感じました。
bmauter 2013

1
プロパティがコピーするように設定されている場合はどうなりますか?たとえば、@ property(非アトミック、コピー)UIColor * lineColor;です。セッター内で、_lineColor = inputを実行できますか。または、_lineColor = [入力コピー]を実行する必要がありますか?
ダニエルT.

1
@DanielT。_lineColor = [input copy];はい、する必要があります。
mattjgalloway 2013

-10

コール

[super setImageURLString:theString];

それでおしまい


1
スーパークラスにはsetImageURLStringの実装がある可能性は低いです。–
Wil Macaulay

たとえそうであっても、それはおそらくあなたがそれをしたくないことをするでしょう。
Nate Symer 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.