此篇文章為了紀(jì)念26K的大神
舉個??
有一個對象,Person 里面有兩個屬性 name,age 假設(shè)都是字符串 這時候調(diào)用Pereson copy
要知道,自定義對象想支持copy 需要實現(xiàn)coping協(xié)議,實現(xiàn)copy函數(shù)
copyWithZone
具體是深拷貝 還是淺拷貝 就看這個函數(shù)怎么實現(xiàn)了
/** 淺拷貝 */
- (id)mutableCopyWithZone:(NSZone *)zone{
Person *person = [[Person allocWithZone:zone] init];
person.age = self.age;
person.name = self.name;
return person;
}
/** 深拷貝 */
- (id)mutableCopyWithZone:(NSZone *)zone{
Person *person = [[Person allocWithZone:zone] init];
person.age = [self.age copy];
person.name = [self.name copy];
//注意如果Person包含了別的自定義對象,那每個屬性都要這樣copy
return person;
}
不能理解的話 這里還有兩張圖可以看圖理解一下

淺拷貝

深拷貝
- 淺拷貝即使copy出一個新的對象但它的屬性還是指向舊對象的內(nèi)存地址
- 而深拷貝的話 就是copy出一個和舊對象一點關(guān)系都沒有的新對象 保證所有屬性都開辟出新的內(nèi)存空間
新的Person肯定是新的對象 新的內(nèi)存地址 ,這樣才發(fā)生了 copy 行為,像網(wǎng)上說的沒有新內(nèi)存地址那個不叫拷貝,那叫賦值
總結(jié):
1.就是深拷貝是完整的復(fù)制了一個人,這個人復(fù)制出來就和本人沒關(guān)系了,各自修改屬性啥的都不影響
2.而淺拷貝可能會受到本人的改變而改變,因為他的各種屬性還是指向本人的內(nèi)存地址
系統(tǒng)級的函數(shù) 都是淺拷貝
所有集合類API 都是淺拷貝

新增內(nèi)容