用弧覆盖设置器

Posted

技术标签:

【中文标题】用弧覆盖设置器【英文标题】:Override setter with arc 【发布时间】:2011-12-17 08:32:23 【问题描述】:
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

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

【问题讨论】:

是的,这对我来说是正确的。效果是否符合您的预期? 【参考方案1】:

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

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

【讨论】:

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

扩展@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 相关的问题很有用]

【讨论】:

谢谢你,我对我的代码(和这个答案)进行了第二次猜测,但你已经消除了我的恐惧。 谢谢马特。作为第 43 位选民感觉不太对,因为 42 似乎是这个答案的合适投票数。 如果属性设置为复制呢?例如@property (nonatomic, copy) UIColor *lineColor;。在二传手里面,我可以做 _lineColor = input;还是我必须做 _lineColor = [输入副本];? @DanielT。你必须做_lineColor = [input copy];,是的。【参考方案3】:

打电话

[super setImageURLString:theString];

就是这样

【讨论】:

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

以上是关于用弧覆盖设置器的主要内容,如果未能解决你的问题,请参考以下文章

为多对多关系覆盖核心数据设置器方法

覆盖继承的属性设置器

iOS Objective C 覆盖属性设置器

如何使用位置构造函数获取 C# 记录设置器的代码覆盖率

如何用 Jest 单元测试覆盖 TypeORM @Column 装饰器?

如何用许多否定(:not)覆盖选择器?