2011-10-28 31 views
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 cài đặt khi ARC được bật chưa?Ghi đè thiết lập với vòng cung

+2

Có, điều này có vẻ đúng với tôi. Nó hoạt động như thế nào bạn mong đợi hay không? –

Trả lời

89

Có, điều này là chính xác. Cũng đã cho tôi một thời gian để tin tưởng rằng đây thực sự là điều phải làm.

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

+6

Có. 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. – rowwingman

+4

Ồ, phải, xin lỗi, tôi đã hào phóng bỏ qua nhận xét đó. :) – Pascal

+4

Bạn biết điều 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 khác và IDE) ... thường là màu xám nhạt hoặc thứ gì đó không nổi bật. # ff0000 có thể? Nó làm nên sự khác biệt? Chúng tôi là lập trình viên được sử dụng để bỏ qua các bình luận, trừ khi chúng tôi đang cố gắng suy luận cách thức một cái gì đó hoạt động, trong trường hợp này, chúng tôi cũng bỏ qua chúng đôi khi. – figha

68

Mở rộng câu trả lời được đưa ra bởi @Pascal Tôi chỉ muốn thêm rằng đó chắc chắn là điều đúng để làm và bạn có thể kiểm tra bằng cách xem những gì mã biên dịch xuống. Tôi đã viết một blog post về làm thế nào để đi về kiểm tra, nhưng về cơ bản mã mà biên dịch xuống (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 ý các cuộc gọi đến _objc_storeStrongaccording to 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, đúng vậy. ARC đã thêm vào bản phát hành chính xác của giá trị cũ và giữ lại giá trị mới.

[Có lẽ qua câu trả lời phức tạp, nhưng nghĩ rằng nó là hữu ích để hiển thị như thế nào bạn có thể đi về trả lời này sắp xếp của ARC câu hỏi liên quan cho bản thân trong tương lai]

+1

Cảm ơn vì điều này, tôi đã đoán mã của tôi lần thứ hai (và câu trả lời này) nhưng bạn đã đặt nỗi sợ của mình để nghỉ ngơi. – evanflash

+0

Câu trả lời rất hữu ích! –

+1

Cảm ơn Matt. Nó không cảm thấy đúng là cử tri thứ 43, bởi vì 42 dường như là một phiếu bầu thích hợp cho câu trả lời này. – bmauter

-10

Gọi

[super setImageURLString:theString]; 

Vậy đó

+1

siêu lớp không có khả năng thực hiện setImageURLString: –

+0

Thậm chí nếu nó đã làm, nó có thể sẽ làm những thứ bạn không muốn nó làm. –

Các vấn đề liên quan