用弧来覆盖setter
@interface Article : NSObject @property (nonatomic, strong) NSString *imageURLString; @end @implementation Class @synthesize imageURLString = _imageURLString; - (void)setImageURLString:(NSString *)imageURLString { _imageURLString = imageURLString; //do something else }
ARC启用时是否正确覆盖了setter?
是的,这是正确的。 也花了我一段时间来相信这确实是正确的事情。
你知道在这种情况下,覆盖是没有必要的,因为你不会比标准生成的setter做更多的事情吗? 只有当您向setImageURLString:
添加更多代码时setImageURLString:
是否需要覆盖setter。
扩展@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}
注意根据LLVM调用_objc_storeStrong
这样做:
id objc_storeStrong(id *object, id value) { value = [value retain]; id oldValue = *object; *object = value; [oldValue release]; return value; }
所以,回答你的问题,是的,这是正确的。 ARC增加了旧值的正确版本并保留了新值。
[也许过于复杂的答案,但认为这是有用的,以显示你将来如何回答这个类似的ARC相关的问题]
呼叫
[super setImageURLString:theString];
而已