圆弧超越设定器


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
是的,这对我来说似乎正确。它按您的期望工作吗?
罗宾·萨默希尔

Answers:


89

是的,这是正确的。还花了我一段时间来相信这确实是正确的事情。

您确实意识到在这种情况下,没有必要进行覆盖,因为您所做的不超过标准生成的setter所能做的吗?仅当您添加更多代码时,setImageURLString:您才需要覆盖设置器。


6
是。我意识到这一点。我在要添加其他代码的位置添加注释。非常感谢您的答复。
rowwingman 2011年

4
您知道什么是有趣的实验吗?更改注释颜色(在SO和其他站点以及IDE中)...通常是浅灰色或不突出的颜色。#ff0000也许?会有所作为吗?作为程序员,我们习惯于忽略注释,除非我们专门尝试推断事物的工作方式,在这种情况下,有时我们也会忽略它们。
maltalef 2012年

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 2012年

1
谢谢马特。作为第43名选民感到不对劲,因为42岁的选民似乎对此回答非常合适。
bmauter

1
如果该属性设置为可复制该怎么办?例如@property(非原子的,副本)UIColor * lineColor;。在设置器内部,我可以做_lineColor = input; 还是我必须做_lineColor = [输入副本] ;?
Daniel T.

1
@DanielT。你必须做_lineColor = [input copy];,是的。
mattjgalloway

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.