擴展@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相關的問題爲自己]
是的,這對我來說很正確。它是如何工作你期望與否? –