Ghi đè setter bằng vòng cung


108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

Tôi đã ghi đè chính xác bộ cài đặt khi ARC được bật chưa?


2
Vâng, điều này có vẻ đúng với tôi. Nó có hoạt động như bạn mong đợi hay không?
Robin Summerhill

Câu trả lời:


89

Vâng cái này đúng rồi. Tôi cũng đã mất một thời gian để tin tưởng rằng đây thực sự là điều đúng đắn nên làm.

Bạn có nhận ra rằng trong trường hợp này, việc ghi đè là không cần thiết vì bạn không làm nhiều hơn những gì mà trình thiết lập được tạo tiêu chuẩn sẽ làm? Chỉ khi bạn thêm nhiều mã hơn vào setImageURLString:thì bạn mới cần ghi đè bộ cài.


6
Đúng. Tôi nhận ra điều này. Tôi thêm nhận xét nơi tôi muốn thêm mã bổ sung của mình. Cảm ơn bạn rất nhiều vì đã trả lời.
chèo thuyền viên

4
Bạn biết những gì sẽ là một thử nghiệm thú vị? Thay đổi màu nhận xét (trong SO và các trang web và IDE khác) ... thường là màu xám nhạt hoặc màu gì đó không nổi bật. # ff0000 có thể không? Nó làm nên sự khác biệt? Với tư cách là lập trình viên, chúng tôi thường bỏ qua các nhận xét trừ khi chúng tôi đặc biệt cố gắng suy luận cách hoạt động của một thứ gì đó, trong trường hợp đó, đôi khi chúng tôi cũng bỏ qua chúng.
maltalef 14/10/12

68

Mở rộng câu trả lời được đưa ra bởi @Pascal Tôi chỉ muốn nói thêm rằng đó chắc chắn là điều đúng đắn cần làm và bạn có thể kiểm tra bằng cách xem mã biên dịch thành gì. Tôi đã viết một bài đăng trên blog về cách kiểm tra, nhưng về cơ bản mã đó biên dịch thành (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}

Lưu ý lời gọi _objc_storeStrongtheo LLVM thực hiện điều này:

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

Vì vậy, để trả lời câu hỏi của bạn, vâng, đúng vậy. ARC đã thêm vào việc phát hành đúng giá trị cũ và giữ lại giá trị mới.

[Có thể là câu trả lời phức tạp, nhưng tôi nghĩ sẽ hữu ích khi chỉ ra cách bạn có thể trả lời loại câu hỏi liên quan đến ARC này cho chính mình trong tương lai]


1
Cảm ơn vì điều này, tôi đã đoán mã thứ hai của mình (và câu trả lời này) nhưng bạn đã dẹp yên nỗi sợ hãi của tôi.
evanflash

1
Cảm ơn Matt. Cảm thấy không ổn khi trở thành cử tri thứ 43, bởi vì 42 dường như là một cuộc kiểm phiếu phù hợp cho câu trả lời này.
bmauter

1
Còn nếu thuộc tính được thiết lập để sao chép? Ví dụ @property (nonatomic, copy) UIColor * lineColor ;. Bên trong setter, tôi có thể thực hiện _lineColor = input; hay tôi phải làm _lineColor = [input copy];?
Daniel T.

1
@DanielT. bạn phải làm _lineColor = [input copy];, có.
mattjgalloway

-10

Gọi

[super setImageURLString:theString];

Đó là nó


1
lớp siêu có khả năng không có triển khai setImageURLString:
Wil Macaulay

Ngay cả khi nó đã làm, nó có thể sẽ làm những điều bạn không muốn nó làm.
Nate Symer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.