Переопределить сеттер с дугой

108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

Правильно ли я переопределил сеттер, когда включен ARC?

rowwingman
источник
2
Да, мне это кажется правильным. Это работает так, как вы ожидаете, или нет?
Робин Саммерхилл,

Ответы:

89

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

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

паскаль
источник
6
Да. Я это понимаю. Я добавляю комментарий туда, где хочу добавить свой дополнительный код. Большое спасибо за ответ.
гребец
4
Знаете, какой был бы интересный эксперимент? Изменение цвета комментария (в SO и других сайтах и ​​IDE) ... обычно он светло-серый или что-то не выделяющееся. # ff0000 возможно? Будет ли разница? Мы, программисты, привыкли игнорировать комментарии, если мы специально не пытаемся понять, как что-то работает, и в этом случае мы также иногда их игнорируем.
maltalef
68

Расширяя ответ, данный @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]

Mattjgalloway
источник
1
Спасибо за это, я сомневался в своем коде (и этом ответе), но вы развеяли мои опасения.
evanflash 01
1
Спасибо, Мэтт. Было неправильно быть 43-м избирателем, потому что 42 казалось таким подходящим подсчетом голосов для этого ответа.
bmauter 02
1
Что, если свойство настроено на копирование? Например @property (nonatomic, copy) UIColor * lineColor ;. Могу я просто сделать _lineColor = input; внутри установщика; или мне нужно сделать _lineColor = [input copy] ;?
Дэниел Т.
1
@DanielT. ты должен сделать _lineColor = [input copy];, да.
mattjgalloway 08
-10

Вызов

[super setImageURLString:theString];

это оно

раулкатена
источник
1
суперкласс вряд ли будет иметь реализацию setImageURLString:
Wil Macaulay
Даже если бы это было так, он, вероятно, сделал бы то, чего вы не хотите.
Nate Symer