[問題] copy跟retain有什麼不同?

看板MacDev作者 (lyle)時間14年前 (2011/05/06 11:25), 編輯推噓1(1017)
留言18則, 3人參與, 最新討論串1/1
如題 [object copy]與[object retain]有什麼不同呢? 兩者執行後object的retainCount都會加 1 是deep copy 跟 shallow copy的差別嗎? 感謝:) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.250.147.33

05/06 11:45, , 1F
retain 是原來指標指向的物件被標記多使用了一次
05/06 11:45, 1F

05/06 11:45, , 2F
copy 會產生新物件
05/06 11:45, 2F

05/06 11:47, , 3F
但產生新物件 為何他的retainCount不是1而是原來的+1呢?
05/06 11:47, 3F

05/06 11:58, , 4F
你看的是哪個物件?每個物件可以有不同的 copy 實作
05/06 11:58, 4F

05/06 11:59, , 5F
而且通常大部分是沒有實作 copy 的,一個物件要可以 copy
05/06 11:59, 5F

05/06 11:59, , 6F
需要另外實作 copyWithZone:
05/06 11:59, 6F

05/06 12:03, , 7F
我用的是NSDictionary
05/06 12:03, 7F

05/06 12:03, , 8F
所以沒有實作的意思就是他跟retain功能相同嗎?
05/06 12:03, 8F

05/06 12:04, , 9F
不是,如果一個物件沒有實作 copyWithZone:,一呼叫 copy
05/06 12:04, 9F

05/06 12:05, , 10F
就會馬上 crash。
05/06 12:05, 10F

05/06 12:05, , 11F
immutable 的物件有時候 copy 不見得會產生新物件
05/06 12:05, 11F

05/06 12:05, , 12F
那我用[dictionary copy]為何他的ratainCopy會加1呢?
05/06 12:05, 12F

05/06 12:06, , 13F
因為多生一個物件的意義往往不大
05/06 12:06, 13F

05/06 12:07, , 14F
可能是 NSDictionary 把 copy 的實作成 retain,Foundation
05/06 12:07, 14F

05/06 12:07, , 15F
的一些實作經常改來改去。你可以試試看 copy 一個
05/06 12:07, 15F

05/06 12:07, , 16F
NSMutableDictionary 看看,可能就會出現不同的結果。
05/06 12:07, 16F

05/06 13:58, , 17F
有些 immutable (array, dict)的 copy 和 retain ,沒差別
05/06 13:58, 17F

05/06 14:03, , 18F
反正照著規矩來 retain-release, copy-release 就是了
05/06 14:03, 18F
文章代碼(AID): #1DmseWbO (MacDev)
文章代碼(AID): #1DmseWbO (MacDev)