深淺拷貝相信對(duì)于大多數(shù)iOS開(kāi)發(fā)者而言并不陌生搏予,寫這篇文章的目的是在公司項(xiàng)目的開(kāi)發(fā)中遇到的一個(gè)可變數(shù)組賦值問(wèn)題所以專門總結(jié)下深淺拷貝的知識(shí)。
提要
本篇文章主要圍繞以下幾點(diǎn)來(lái)講述:
1橘荠、深淺拷貝的概念
2、集合與非集合對(duì)象的深淺拷貝差異
3郎逃、一些Tips
拷貝前提
一個(gè)對(duì)象是否可以拷貝取決于該對(duì)象是否遵循NSCopying協(xié)議哥童,并且實(shí)現(xiàn)copyWithZone:方法。如果一個(gè)類有可變和不可變類型褒翰,那么不可變類需要遵守NSMutableCopying協(xié)議贮懈,并且實(shí)現(xiàn)mutableCopyWithZone 方法確保被復(fù)制對(duì)象保持可變匀泊。
深淺拷貝的概念
淺拷貝:指針拷貝,僅拷貝對(duì)象指針朵你,對(duì)象內(nèi)存地址并不發(fā)生改變各聘。
深拷貝:內(nèi)容拷貝,完全復(fù)制一份對(duì)象撬呢,復(fù)制對(duì)象與舊對(duì)象內(nèi)存地址不同伦吠。
集合與非集合對(duì)象的深淺拷貝
對(duì)于iOS中的對(duì)象來(lái)說(shuō),我們可以將其大致的分為集合對(duì)象(NSArray魂拦、NSSet等)和非集合對(duì)象(NSString毛仪、NSNumber等)。對(duì)于拷貝而言有如下幾種情況芯勘。
1箱靴、不可變對(duì)象的拷貝操作
2、不可變對(duì)象的可變拷貝操作
3荷愕、可變對(duì)象的拷貝操作
4衡怀、可變對(duì)象的可變拷貝操作
非集合對(duì)象的深淺拷貝
1、不可變對(duì)象的拷貝操作
打印結(jié)果
結(jié)論:不可變對(duì)象copy為淺復(fù)制安疗,mutableCopy為深復(fù)制抛杨。
2、可變對(duì)象的拷貝操作
打印結(jié)果
結(jié)論:不可變對(duì)象copy與mutableCopy都是深復(fù)制
集合對(duì)象的深淺拷貝
集合對(duì)象深淺拷貝圖解
1荐类、集合對(duì)象的淺復(fù)制
對(duì)于集合來(lái)說(shuō)有許多種方法來(lái)實(shí)現(xiàn)淺復(fù)制怖现。當(dāng)進(jìn)行淺復(fù)制的時(shí)候,會(huì)向原始對(duì)象發(fā)送一個(gè)retain消息玉罐,同時(shí)指針會(huì)指向新的集合屈嗤。
2、集合對(duì)象的深復(fù)制
方式一
需要將第二個(gè)參數(shù)設(shè)置為yes吊输。
方式二
復(fù)制與可變性
當(dāng)復(fù)制一個(gè)集合對(duì)象的時(shí)候饶号,集合對(duì)象本身和集合所包含元素的可變性會(huì)受到影響。
copyWithZone: 僅使表層集合對(duì)象不可變季蚂,集合內(nèi)部對(duì)象仍保持原有狀態(tài).
initWithArray:copyItems:第二個(gè)參數(shù)為NO時(shí)茫船,表明該類創(chuàng)建時(shí)的表層可變性保持其初始值。更深層元素保持元其原有的可變性扭屁。
歸檔解檔集合使得對(duì)象的可變與之前完全不同透硝。
3、不可變集合對(duì)象的copy與mutableCopy
結(jié)果:
結(jié)論: 不可變集合對(duì)象copy為淺復(fù)制疯搅,mutableCopy為深復(fù)制
4濒生、可變集合對(duì)象的copy與mutableCopy
結(jié)果:
結(jié)論:可變集合對(duì)象的copy與mutableCopy都是深復(fù)制。
一些tips
1幔欧、對(duì)于包含可變類型的類來(lái)說(shuō)例如NSString罪治,建議在寫property時(shí)使用copy關(guān)鍵字丽声,保護(hù)封裝性。
2觉义、對(duì)于從外部傳入的數(shù)組雁社,在函數(shù)內(nèi)部對(duì)其進(jìn)行拷貝操作,保證外部對(duì)數(shù)組的操作不會(huì)影響內(nèi)部的晒骇。
3霉撵、等號(hào)直接賦值為淺復(fù)制。
希望以上總結(jié)對(duì)各位讀者有所幫助洪囤。因個(gè)人能力所限徒坡,如果錯(cuò)誤及紕漏還請(qǐng)廣大讀者批評(píng)指正。