แทนที่ตัวตั้งค่าด้วยส่วนโค้ง


108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

ฉันแทนที่ setter อย่างถูกต้องเมื่อเปิดใช้งาน ARC หรือไม่?


2
ใช่นี่ดูเหมาะกับฉัน มันทำงานตามที่คุณคาดหวังหรือไม่?
Robin Summerhill

คำตอบ:


89

ใช่นี่ถูกต้อง ฉันยังต้องใช้เวลาอีกสักพักเพื่อวางใจว่านี่เป็นสิ่งที่ถูกต้องที่จะทำ

คุณทราบดีว่าในกรณีนี้การลบล้างไม่จำเป็นเนื่องจากคุณไม่ได้ทำเกินกว่าที่ตัวตั้งค่ามาตรฐานจะทำ? เฉพาะในกรณีที่คุณเพิ่มรหัสเพิ่มเติมsetImageURLString:คุณจะต้องแทนที่ตัวตั้งค่า


6
ใช่. ฉันตระหนักถึงสิ่งนี้ ฉันเพิ่มความคิดเห็นที่ฉันต้องการเพิ่มรหัสเพิ่มเติมของฉัน ขอบคุณมากสำหรับการตอบกลับ
rowwingman

4
คุณรู้ไหมว่าการทดลองที่น่าสนใจคืออะไร? การเปลี่ยนสีของความคิดเห็น (ใน SO และไซต์และ IDE อื่น ๆ ) ... โดยปกติแล้วจะเป็นสีเทาอ่อนหรือสิ่งที่ไม่โดดเด่น # ff0000 อาจจะ? มันจะสร้างความแตกต่าง? เราในฐานะโปรแกรมเมอร์มักใช้ในการเพิกเฉยต่อความคิดเห็นเว้นแต่ว่าเราจะพยายามสรุปวิธีการทำงานของบางสิ่งโดยเฉพาะซึ่งในบางครั้งเราก็เพิกเฉยเช่นกัน
maltalef

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}

สังเกตการเรียก_objc_storeStrongที่ตาม LLVMทำสิ่งนี้:

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

เพื่อตอบคำถามของคุณใช่ถูกต้อง ARC ได้เพิ่มการปล่อยค่าเก่าที่ถูกต้องและคงไว้ซึ่งค่าใหม่

[อาจจะเป็นคำตอบที่ซับซ้อน แต่คิดว่ามันมีประโยชน์ที่จะแสดงให้เห็นว่าคุณจะตอบคำถามเกี่ยวกับ ARC ประเภทนี้ให้ตัวเองได้อย่างไรในอนาคต]


1
ขอบคุณสำหรับสิ่งนี้ฉันเดารหัสของฉันเป็นครั้งที่สอง (และคำตอบนี้) แต่คุณทำให้ความกลัวของฉันสงบลง
evanflash

1
ขอบคุณ Matt รู้สึกไม่ถูกต้องในการเป็นผู้มีสิทธิเลือกตั้งคนที่ 43 เพราะ 42 ดูเหมือนจะเป็นการนับคะแนนที่เหมาะสมสำหรับคำตอบนี้
bmauter

1
ถ้าคุณสมบัติถูกตั้งค่าให้คัดลอกล่ะ? ตัวอย่างเช่น @property (nonatomic, copy) UIColor * lineColor; ข้างใน setter ฉันทำได้แค่ _lineColor = input; หรือต้องทำ _lineColor = [input copy];?
Daniel T.

1
@DanielT. คุณต้องทำ_lineColor = [input copy];ใช่
mattjgalloway

-10

โทร

[super setImageURLString:theString];

แค่นั้นแหละ


1
superclass ไม่น่าจะมีการใช้งาน setImageURLString:
Wil Macaulay

แม้ว่าจะเป็นเช่นนั้น แต่ก็อาจทำในสิ่งที่คุณไม่ต้องการให้ทำ
Nate Symer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.