1. 程式人生 > >玩轉深拷貝/淺拷貝

玩轉深拷貝/淺拷貝

font 工作 首地址 父類 init 關系 fan height 計算機

========================================

首先給出NSStirngNSArrayNSMutableArray三者copy/mutableCopy後的規律表格,方便有一個直觀的看法。

原對象類型

調用的拷貝方法

副本對象類型 是否產生新對象 拷貝類型
NSString copy NSString NO 淺拷貝(指針拷貝)
mutableCopy NSMutableString YES 深拷貝(內容拷貝)
NSMutableString copy NSString YES 深拷貝(內容拷貝)
mutableCopy NSMutableString YES 深拷貝(內容拷貝)
NSArray copy NSArray NO 淺拷貝(指針拷貝)
mutableCopy NSMutableArray YES 深拷貝(內容拷貝)

註意:對於NSDictionaryNSMutableDictionaryNSMutableArray上面的規律依然適用。

為了幫助整理,把上述表中的規律整理出來,如下所述:

淺拷貝 == 指針拷貝 == 不產生新的對象。

深拷貝 == 內容拷貝 == 會產生新的對象。

如果原對象是mutable類型,那麽不管調用copy還是mutableCopy,都是深拷貝。

如果原對象是imutable類型,那麽copy就是淺拷貝,mutableCopy就是深拷貝。

【誤區糾正】調用copy就是淺拷貝,調用mutableCopy就是深拷貝。這樣的理解是錯誤的!

========================================

指針與存儲的數據之間的關系,這塊知識在C語言中講得比較明白。

【文章推薦http://c.biancheng.net/cpp/html/490.html

int a = 8

int b = &a

等價於

int *c = 8

首先,計算機會在內存中使用一塊內存空間,內存空間的最小單位是字節。在DOS下的16位編程中int類型的數據需要2個字節,沒個字節都是有自己的編號(也就是地址)。然後在這段空間中存儲下8這個數據,當然用的是二進制。—————到此為止,這段內存空間是真真實實存在的,也是的確存儲了8這個數據的。然後呢,給出一個表格,各自體會。

變量名 存儲空間 內存地址
a 8

0x10025656

b

0x10025656

0x14236897
c 0x10025656 0x18943589

========================================

需要真實明白什麽就指針拷貝與內容拷貝。

下面從一行代碼為切入點進行分析:

Person *p = [[Person alloc] init];

Person p

這句話,僅僅聲明了一個變量而已。並且這個變量的類型是Person類型。

同時p是一個局部變量,所以p變量是存儲在棧區的。

p*放在一起表示p變量是一個指針變量,既然是指針變量,那麽p只能存儲一個內存地址。

本質上來說,p是一個指針變量而不是一個對象,p中存放的是某一塊內存區域的首地址。

[[Person alloc] init]

alloc在堆區開辟了一塊內存空間,用來存放Person類的一個具體對象。

init是進行了一些初始化的操作。

Person *p = [[Person alloc] init];

這句話的意思是將等號後面的生成的具體對象的地址賦值給了p這個指針變量。

並且這個過程該具體對象被強引用一次,引用計數+1

指針拷貝指的就是將對象p的地址復制一份給另一個指針變量。

內容拷貝指的是再開辟一塊內存空間用來放置一個對象p,然後將這塊新內存空間的地址給另一個指針變量。

========================================

集合對象的單層深拷貝、雙層深拷貝、完全深拷貝。

(更新中-----先工作)

========================================

為什麽UIView不能使用copy屬性限定符、copy方法?

因為UIView及其父類並沒有像NSArray一樣遵守NSCopyingNSMutableCopying協議,因此不能用copy

(更新中-----先工作)

========================================

認識下copystrongretain三個屬性限定符。

(更新中-----先工作)

為什麽block使用copy修飾符?

(更新中-----先工作)

========================================

玩轉深拷貝/淺拷貝