2011-10-28 30 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

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