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中相對應元素的指針.這便是所謂的"淺復制".