用弧覆盖setter

时间:2011-10-28 14:34:02

标签: iphone ipad ios5 automatic-ref-counting

@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

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

3 个答案:

答案 0 :(得分:89)

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

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

答案 1 :(得分:68)

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

答案 2 :(得分:-10)

致电

[super setImageURLString:theString];

就是这样