Expandindo a resposta dada por @Pascal, gostaria apenas de acrescentar que é definitivamente a coisa certa a se fazer e você pode verificar o que o código compila. Eu escrevi uma postagem no blog sobre como fazer a verificação, mas basicamente esse código é compilado para (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}
Observe a chamada _objc_storeStrong
que, de acordo com o LLVM, faz isso:
id objc_storeStrong(id *object, id value) {
value = [value retain];
id oldValue = *object;
*object = value;
[oldValue release];
return value;
}
Então, para responder à sua pergunta, sim, está certo. A ARC adicionou na liberação correta do valor antigo e na retenção do novo valor.
[Provavelmente devido a uma resposta complicada, mas pensei que seria útil mostrar como você pode responder a esse tipo de pergunta relacionada ao ARC no futuro]