iOS 真正的理解深淺拷貝

此篇文章為了紀(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)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容