ChatGPT解决这个技术问题 Extra ChatGPT

用弧覆盖设置器

@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

启用 ARC 时我是否正确覆盖了设置器?

是的,这对我来说是正确的。它是否按您的预期工作?

E
Evan

是的,这是正确的。我也花了一段时间才相信这确实是正确的做法。

您确实意识到在这种情况下,不需要覆盖,因为您不会做比标准生成的 setter 做的更多的事情吗?只有向 setImageURLString: 添加更多代码时,您才需要覆盖设置器。


是的。我意识到这一点。我在要添加附加代码的地方添加注释。非常感谢您的回复。
你知道什么是有趣的实验吗?更改评论颜色(在 SO 和其他站点和 IDE 中)...通常是浅灰色或不显眼的东西。 #ff0000 也许?它会有所作为吗?作为程序员,我们习惯于忽略注释,除非我们特别试图推断某些东西是如何工作的,在这种情况下,我们有时也会忽略它们。
m
mattjgalloway

扩展@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}

请注意对 according to LLVM 执行此操作的 _objc_storeStrong 的调用:

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

所以,回答你的问题,是的,没错。 ARC 已添加正确释放旧值并保留新值。

[可能过于复杂的答案,但认为展示您将来如何为自己回答此类与 ARC 相关的问题很有用]


谢谢你,我在猜测我的代码(和这个答案),但你已经让我的恐惧安息了。
谢谢马特。作为第 43 位选民感觉不太对,因为 42 似乎是这个答案的合适投票数。
如果属性设置为复制呢?例如@property (nonatomic, copy) UIColor *lineColor;。在二传手里面,我可以做 _lineColor = input;还是我必须做_lineColor = [输入副本];?
@丹尼尔T。你必须做_lineColor = [input copy];,是的。
k
kleopatra

称呼

[super setImageURLString:theString];

而已


超类不可能有 setImageURLString 的实现:
即使它这样做了,它也可能会做一些你不希望它做的事情。