對源頭是NSMutableString的字符串,retain僅僅是指針引用,增加了引用計數器,這樣源頭改變的時候,用這種retain方式聲明的變量(無論被賦值的變量是可變的還是不可變的),它也會跟著改變;而copy聲明的變量,它不會跟著源頭改變,它實際上是深拷貝。對源頭是NSString的字符串,無論是retain聲明的變量還是copy聲明的變量,當第二次源頭的字符串重新指向其它的地方的時候,它還是指向原來的最初的那個位置,也就是說其實二者都是指針引用,也就是淺拷貝。
另外說明一下,這兩者對內存計數的影響都是一樣的,都會增加內存引用計數,都需要在最后的時候做處理。
其實說白了,對字符串為啥要用這兩種方式?我覺得還是一個安全問題,比如聲明的一個NSString *str變量,然后把一個NSMutableString *mStr變量的賦值給它了,如果要求str跟著mStr變化,那么就用retain;如果str不能跟著mStr一起變化,那就用copy。而對于要把NSString類型的字符串賦值給str,那兩都沒啥區別。不會影響安全性,內存管理也一樣。(轉)