1. 程式人生 > >OC 深拷貝、淺拷貝

OC 深拷貝、淺拷貝

複製程式碼
 #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");
複製程式碼