Переопределить сеттер с помощью дуги - PullRequest
108 голосов
/ 28 октября 2011
@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 ]

89 голосов
/ 29 октября 2011

Да, это правильно.Кроме того, мне потребовалось некоторое время, чтобы поверить, что это действительно правильно.

Вы действительно понимаете, что в этом случае переопределение не требуется, поскольку вы не делаете больше, чем будет делать стандартный сгенерированный установщик?Только если вы добавите больше кода в setImageURLString:, вам потребуется переопределить установщик.

68 голосов
/ 06 января 2012

В продолжение ответа, данного @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}

Обратите внимание на вызов _objc_storeStrong, который в соответствииLLVM делает это:

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

Итак, чтобы ответить на ваш вопрос, да, это правильно.ARC добавил правильное освобождение старого значения и сохранил новое значение.

[Возможно, слишком сложный ответ, но подумал, что было бы полезно показать, как вы можете ответить на этот вопрос, связанный с ARC, длясебя в будущем]

0 голосов
/ 24 января 2014

Звоните

[super setImageURLString:theString];

Вот и все

...