Ganti penyetel dengan busur

108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

Apakah saya mengganti penyetel dengan benar saat ARC diaktifkan?

rowwingman
sumber
2
Ya, ini terlihat benar bagi saya. Apakah ini berfungsi seperti yang Anda harapkan atau tidak?
Robin Summerhill

Jawaban:

89

Ya, ini benar. Aku juga butuh beberapa saat untuk percaya bahwa ini memang hal yang benar untuk dilakukan.

Anda menyadari bahwa dalam kasus ini, penggantian tidak diperlukan karena Anda tidak melakukan lebih dari yang akan dilakukan penyetel yang dibuat standar? Hanya jika Anda menambahkan lebih banyak kode, setImageURLString:Anda perlu mengganti penyetel.

Pascal
sumber
6
Iya. Saya menyadari ini. Saya menambahkan komentar di mana saya ingin menambahkan kode tambahan saya. Terima kasih banyak atas balasannya.
rowwingman
4
Anda tahu apa yang akan menjadi eksperimen yang menarik? Mengubah warna komentar (di SO dan situs lain serta IDE) ... biasanya berwarna abu-abu terang atau sesuatu yang tidak menonjol. # ff0000 mungkin? Apakah ini akan membuat perbedaan? Kami sebagai pemrogram terbiasa mengabaikan komentar kecuali kami secara khusus mencoba menyimpulkan cara kerja sesuatu, dalam hal ini kami terkadang juga mengabaikannya.
maltalef
68

Memperluas jawaban yang diberikan oleh @Pascal Saya hanya ingin menambahkan bahwa itu pasti hal yang benar untuk dilakukan dan Anda dapat memeriksa dengan melihat apa yang dikompilasi kode. Saya menulis posting blog tentang bagaimana cara memeriksa, tetapi pada dasarnya kode itu dikompilasi ke (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}

Perhatikan panggilan _objc_storeStrongyang menurut LLVM melakukan ini:

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

Jadi, untuk menjawab pertanyaan Anda, ya itu benar. ARC telah menambahkan dalam rilis yang benar dari nilai lama dan mempertahankan nilai baru.

[Mungkin jawaban yang terlalu rumit, tetapi menurut saya berguna untuk menunjukkan bagaimana Anda bisa menjawab pertanyaan terkait ARC semacam ini untuk diri Anda sendiri di masa mendatang]

mattjgalloway
sumber
1
Terima kasih untuk ini, saya sedang menebak-nebak kode saya (dan jawaban ini) tetapi Anda telah menempatkan ketakutan saya untuk beristirahat.
evanflash
1
Terima kasih Matt. Rasanya tidak tepat menjadi pemilih ke-43, karena 42 sepertinya penghitungan suara yang pas untuk jawaban ini.
bmauter
1
Bagaimana jika properti disetel untuk disalin? Misalnya @property (nonatomic, copy) UIColor * lineColor ;. Di dalam penyetel, dapatkah saya melakukan _lineColor = input; atau apakah saya harus melakukan _lineColor = [input copy] ;?
Daniel T.
1
@Daniel. Anda harus melakukannya _lineColor = [input copy];, ya.
mattjgalloway
-10

Panggilan

[super setImageURLString:theString];

Itu dia

raulcatena
sumber
1
superclass kemungkinan tidak memiliki implementasi setImageURLString:
Wil Macaulay
Bahkan jika ya, itu mungkin akan melakukan hal-hal yang tidak Anda inginkan.
Nate Symer