assign retain 和copy的區別

2022-08-19 05:06:10 字數 1540 閱讀 5668

assign

對基礎資料型別 (nsinteger,cgfloat)和c資料型別(int, float, double, char)等 等. 此標記說明設定器直接進⾏行賦值,這也是預設值。在使⽤用垃圾收集的應⽤用程式中,如 果你要⼀乙個屬性使⽤用assign,且這個類符合nscopying協 議,你就要明確指出這個標 記,⽽而不是簡單地使⽤用預設值,否則的話,你將得到⼀乙個編譯警告。這再次向編譯器說 明你確實需要賦值,即使它是可拷⻉貝的。

retain對其他nsobject和其⼦子類對引數進⾏行release舊值,再retain新值指定retain會在賦 值時喚醒傳⼊入值的retain訊息。此屬性只能⽤用於objective-c物件型別,⽽而不能⽤用於core

foundation物件。(原因很明顯,retain會增加物件的引⽤用計數,⽽而基本資料型別或者 core foundation物件都沒有引⽤用計數——譯者注)。

注意: 把物件新增到陣列中時,引⽤用計數將增加物件的引⽤用次數+1。

copy

對nsstring 它指出,在賦值時使⽤用傳⼊入值的⼀乙份拷⻉貝。拷⻉貝⼯工作由copy⽅方法執⾏行,此屬 性只對那些實⾏行了nscopying協議的物件型別有效。更深⼊入的討論,請參考「複製」部 分。
copy與retain:

copy其實是建⽴立了⼀乙個相同的物件,⽽而retain不是:
1.⽐比如⼀乙個nsstring 物件,位址為0×1111 ,內容為@」str」,copy 到另外⼀乙個 nsstring 之後,位址為0×2222 ,內容相同。
2.新的物件retain為1 ,舊有物件沒有變化retain 到另外⼀乙個nsstring 之後,位址相同 (建⽴立⼀乙個指標,指標拷⻉貝),內容當然相同,這個物件的retain值+1。
總結:retain 是指標拷⻉貝,copy 是內容拷⻉貝。
assign與retain:
1. 接觸過c,那麼假設你⽤用malloc分配了⼀一塊記憶體,並且把它的位址賦值給了指標a, 後來你希望指標b也共享這塊記憶體,於是你⼜又把a賦值給(assign)了b。此時a和b指向 同⼀一塊記憶體,請問當a不再需要這塊記憶體,能否直接釋放它?答案是否定的,因為a並不 知道b是否還在使⽤用這塊記憶體,如果a釋放了,那麼b在使⽤用這塊記憶體的時候會引起程式 crash掉。
2. 了解到1中assign的問題,那麼如何解決?最簡單的⼀乙個⽅方法就是使⽤用引⽤用計數 (reference counting),還是上⾯面的那個例⼦子,我們給那塊記憶體設⼀乙個引⽤用計數,當 記憶體被分配並且賦值給a時,引⽤用計數是1。當把a賦值給b時引⽤用計數增加到2。這時如 果a不再使⽤用這塊記憶體,它只需要把引⽤用計數減1,表明⾃自⼰己不再擁有這塊記憶體。b不再 使⽤用這塊記憶體時也把引⽤用計數減1。當引⽤用計數變為0的時候,代表該記憶體不再被任何指 針所引⽤用,系統可以把它直接釋放掉。 總結:上⾯面兩點其實就是assign和retain的區別,assign就是直接賦值,從⽽而可能引起 1中的問題,當資料為int, float等原⽣生型別時,可以使⽤用assign。retain就如2中所述, 使⽤用了引⽤用計數,retain引起引⽤用計數加1, release引起引⽤用計數減1,當引⽤用計數為0 時,dealloc函式被調⽤用,記憶體被**。

assign retain和copy的區別

一 assign屬性 當資料型別為int float等原生型別時,可以使用assign,否則可能導致記憶體洩露。例如當使用malloc分配了一塊記憶體,並把它的位址賦值給了指標a,後來如果希望指標b也共享這塊記憶體,於是講a賦值給 assgin b。這時就用到了assgin,此時a和b指向同一塊記憶...

assign retain和copy的區別

一 assign屬性 當資料型別為int float等原生型別時,可以使用assign,否則可能導致記憶體洩露。例如當使用malloc分配了一塊記憶體,並把它的位址賦值給了指標a,後來如果希望指標b也共享這塊記憶體,於是講a賦值給 assgin b。這時就用到了assgin,此時a和b指向同一塊記憶...

Dockerfile中的add指令和copy指令

在一次學習中看到的,記錄下來留作筆記。add 源路徑 目標路徑 copy 指令將從構建上下文目錄中 源路徑 的檔案 目錄複製到新的一層的映象內的 目標路徑 位置。使用copy指令,原始檔的各種元資料都會保留。比如讀 寫 執行許可權 檔案變更時間等。這個特性對於映象定製很有用。特別是構建相關檔案都在使...