扩展@Pascal给出的答案我只想补充一点,这绝对是正确的做法,您可以通过查看代码编译的内容来进行检查。我写了一个blog post关于如何去检查,但基本上是代码编译成(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
进行通话的according to LLVM做到这一点:
id objc_storeStrong(id *object, id value) {
value = [value retain];
id oldValue = *object;
*object = value;
[oldValue release];
return value;
}
因此,要回答你的问题,是的,这是正确的。 ARC增加了旧值的正确版本并保留了新值。
[可能在复杂的答案,但认为它是有用的,以显示你可以如何去在未来回答这种ARC相关的问题为自己]
是的,这对我来说很正确。它是如何工作你期望与否? –