Ampliando la respuesta dada por @Pascal, solo me gustaría agregar que definitivamente es lo correcto y puede verificar viendo en qué se compila el código. Escribí una publicación de blog sobre cómo realizar la verificación, pero básicamente ese código se compila en (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}
Tenga en cuenta la llamada a la _objc_storeStrong
que según LLVM hace esto:
id objc_storeStrong(id *object, id value) {
value = [value retain];
id oldValue = *object;
*object = value;
[oldValue release];
return value;
}
Entonces, para responder a su pregunta, sí, es correcto. ARC ha agregado la liberación correcta del valor anterior y la retención del nuevo valor.
[Probablemente una respuesta demasiado complicada, pero pensé que era útil mostrar cómo puede responder usted mismo a este tipo de preguntas relacionadas con ARC en el futuro]