Переопределить сеттер с дугой
@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
Да, это правильно. Также мне потребовалось некоторое время, чтобы поверить, что это действительно правильно.
Вы понимаете, что в этом случае переопределение не требуется, так как вы не делаете больше, чем это делает стандартный созданный сеттер? Только если вы добавите больше кода в setImageURLString:
, вам нужно переопределить сеттер.
Ответ 2
Развернувшись на ответе @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 для себя в будущем]
Ответ 3
Вызов
[super setImageURLString:theString];
Что он