用弧覆盖设置器
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 的实现: 即使这样做了,它也可能会做一些你不希望它做的事情。以上是关于用弧覆盖设置器的主要内容,如果未能解决你的问题,请参考以下文章