copy和retain區(qū)別

copy: 建立一個索引計數(shù)為1的對象,然后釋放舊對象

retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數(shù)為1

Copy其實是建立了一個相同的對象,而retain不是,retain是指針拷貝,copy是內(nèi)容拷貝。

對源頭是NSMutableString的字符串,retain僅僅是指針引用,增加了引用計數(shù)器,這樣源頭改變的時候,用這種 retain方式聲明的變量(無論被賦值的變量是可變的還是不可變的),它也會跟著改變;

而copy聲明的變量,它不會跟著源頭改變,它實際上是深拷貝。

對源頭是NSString的字符串,無論是retain聲明的變量還是copy聲明的變量,當?shù)诙卧搭^的字符串重新指向其它的地方的時候,它還是指向原來的最初的那個位置,也就是說其實二者都是指針引用,也就是淺拷貝。

其實說白了,對字符串為啥要用這兩種方式?我覺得還是一個安全問題

比如聲明的一個NSString *str變量,然后把一個NSMutableString *mStr變量的賦值給它了,如果要求str跟著mStr變化,那么就用retain;

如果str不能跟著mStr一起變化,那就用copy。

而對于要把 NSString類型的字符串賦值給str,那兩都沒啥區(qū)別。不會影響安全性,內(nèi)存管理也一樣。

如果copy的是一個NSArray呢?這時只是copy了指向array中相對應元素的指針.這便是所謂的"淺復制".

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容