OC 深拷貝、淺拷貝
阿新 • • 發佈:2019-01-31
#import<Foundation/Foundation.h> int main (int argc, const char * argv[]) { @autoreleasepool { ===========================第一種:非容器類不可變物件================== NSString *str1=@"one day"; printf("\n初始化賦值引用計數為::::%lu",str1.retainCount); NSString*strCopy1=[str1 retain]; printf("\n繼續retain引用計數為:::%lu",str1.retainCount); NSString *strCopy2=[str1 copy]; printf("\n繼續copy後引用計數為::::%lu",str1.retainCount); NSString *strCopy3=[str1 mutableCopy]; printf("\n繼續mutableCopy後為:::%lu\n",str1.retainCount); printf("\n非容器類不可變物件\n原始地址::::::::::%p",str1); printf("\nretain複製::::::::%p",strCopy1); printf("\ncopy複製::::::::::%p",strCopy2); printf("\nmutableCopy複製:::%p",strCopy3); //這裡說明該型別不存在引用計數的概念 // 初始化賦值引用計數為:18446744073709551615 // 繼續retain引用計數為:18446744073709551615 // 繼續copy後引用計數為:18446744073709551615// 繼續mutableCopy後為:18446744073709551615 小提示:這裡很多人都說是賦值,所以就好解釋這裡沒引用計數的概念。而且也能解釋為什麼 NSString *strCopy2=[str1 copy]; NSMutableString *strCopy2=[str1 copy]; 這樣都不會報錯的原因了。那既然只是簡單賦值為什麼要這麼麻煩呢,直接 NSString *strCopy2=*str1; NSMutableString *strCopy2=*str1; 其實大家都看出來了,這裡是指標變數,只存在“指標的複製”, 跟賦值概念完全不同,雖然這裡看起來很像。 原來該型別是字串常量時,系統會為我們優化,聲明瞭多個字串, 但是都是常量,且內容相等,那麼系統就只為我們申請一塊空間。 疑問: 深複製=淺複製+賦值嗎? 賦值過程:輸入資料→暫存器處理→開闢記憶體→寫入資料。 一次深複製,可以得到被複制物件指標,並進行一次賦值操作。 //非容器類不可變物件 //原始地址::::::::::0x1000033d0 //retain複製::::::::0x1000033d0//淺複製 //copy複製::::::::::0x1000033d0//淺複製 //mutableCopy複製:::0x10010c420//深複製 printf("\n");