2011-10-28 58 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 
} 

當ARC啓用時,我是否正確覆蓋了設定器?用圓弧覆蓋設定器

+2

是的,這對我來說很正確。它是如何工作你期望與否? –

回答

89

是的,這是正確的。也花了我一段時間來相信這確實是一件正確的事情。

你知道在這種情況下,覆蓋是沒有必要的,因爲你不會比標準生成的setter做的更多嗎?只有當您向setImageURLString:添加更多代碼時,您才需要覆蓋setter。

+6

是的。我意識到這一點。我添加評論,我想添加我的附加代碼。非常感謝您的回覆。 – rowwingman

+4

哦,對,對不起,我慷慨地忽視了這個評論。 :) – Pascal

+4

你知道什麼是一個有趣的實驗嗎?改變評論顏色(在SO和其他網站和IDE中)...通常它是淺灰色或不突出的東西。也許吧?它會有所作爲嗎?我們作爲程序員習慣於忽略註釋,除非我們特別試圖推斷事情是如何工作的,在這種情況下,我們有時也會忽略它們。 – figha

68

擴展@Pascal給出的答案我只想補充一點,這絕對是正確的做法,您可以通過查看代碼編譯的內容來進行檢查。我寫了一個blog post關於如何去檢查,但基本上是代碼編譯成(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進行通話的according to LLVM做到這一點:

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

因此,要回答你的問題,是的,這是正確的。 ARC增加了舊值的正確版本並保留了新值。

[可能在複雜的答案,但認爲它是有用的,以顯示你可以如何去在未來回答這種ARC相關的問題爲自己]

+1

謝謝你,我是在猜測我的代碼(和這個答案),但你已經放下恐懼了。 – evanflash

+0

非常有用的答案! –

+1

謝謝馬特。它並不覺得自己是第43位選民,因爲42對於這個答案似乎是一個合適的選票。 – bmauter

-10

呼叫

[super setImageURLString:theString]; 

就是這樣

+1

超類不太可能具有setImageURLString的實現: –

+0

即使它有,它也可能會做你不希望它做的事情。 –