玩轉深拷貝/淺拷貝
========================================
首先給出NSStirng、NSArray、NSMutableArray三者copy/mutableCopy後的規律表格,方便有一個直觀的看法。
原對象類型 |
調用的拷貝方法 |
副本對象類型 | 是否產生新對象 | 拷貝類型 |
NSString | copy | NSString | NO | 淺拷貝(指針拷貝) |
mutableCopy | NSMutableString | YES | 深拷貝(內容拷貝) | |
NSMutableString | copy | NSString | YES | 深拷貝(內容拷貝) |
mutableCopy | NSMutableString | YES | 深拷貝(內容拷貝) | |
NSArray | copy | NSArray | NO | 淺拷貝(指針拷貝) |
mutableCopy | NSMutableArray | YES | 深拷貝(內容拷貝) |
註意:對於NSDictionary、NSMutableDictionary、NSMutableArray上面的規律依然適用。
為了幫助整理,把上述表中的規律整理出來,如下所述:
淺拷貝 == 指針拷貝 == 不產生新的對象。
深拷貝 == 內容拷貝 == 會產生新的對象。
如果原對象是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一樣遵守NSCopying、NSMutableCopying協議,因此不能用copy。
(更新中-----先工作)
========================================
認識下copy、strong、retain三個屬性限定符。
(更新中-----先工作)
為什麽block使用copy修飾符?
(更新中-----先工作)
========================================
玩轉深拷貝/淺拷貝