iOS深拷貝(mutableCopy)與淺拷貝(copy)

iOS中拷貝分為兩種,深拷貝(mutableCopy)和淺拷貝(copy)。

概念

深拷貝:創(chuàng)建一個(gè)新的指針,并開辟新的內(nèi)存空間,內(nèi)容拷貝自原指針指向的內(nèi)存,并指向它

淺拷貝:只創(chuàng)建一個(gè)新的指針,指向原指針指向的內(nèi)存

需要注意的是在定義屬性的時(shí)候有copy修飾符,這個(gè)修飾符與淺拷貝copy意義是不一樣的。淺拷貝是拷貝的過程,而修飾符copy指的是要做拷貝操作,具體深拷貝還是淺拷貝需要區(qū)分不同的情況

copy mutableCopy
NSString NSString
淺拷貝
NSMutableString
深拷貝
NSMutableString NSString
深拷貝
NSMutableString
深拷貝
NSArray NSArray
淺拷貝
NSMutableArray
深拷貝
NSMutableArray NSArray
深拷貝
NSMutableArray
深拷貝
NSDictionary NSDictionary
淺拷貝
NSMutableDictionary
深拷貝
NSMutableDictionary NSDictionary
深拷貝
NSMutableDictionary
深拷貝

對集合類進(jìn)行mutableCopy時(shí),雖然新建了個(gè)集合類對象,但是集合內(nèi)存儲的元素內(nèi)存地址沒有變化。也就是說深拷貝值只能拷貝對象本身,對象內(nèi)部元素仍然是淺拷貝

想要對集合類對象內(nèi)部的元素進(jìn)行深拷貝可以使用如下方法

NSMutableArray *arr2 = [[NSMutableArray alloc]initWithArray:arr copyItems:YES];
    
NSArray *arr3 = [[NSArray alloc] initWithArray:arr copyItems:YES];
    
NSDictionary *dict1 = [[NSDictionary alloc]initWithDictionary:dict copyItems:YES];
    

設(shè)置copyItems為yes只能保證對集合內(nèi)元素進(jìn)行深拷貝,但是集合內(nèi)元素若還是集合類型。那它的集合類型內(nèi)部元素仍是淺拷貝

可以通過歸檔解檔的方式實(shí)現(xiàn)完全的深拷貝

自定義類如果需要copy操作,需要兩步

1.讓類實(shí)現(xiàn)NSCopying/NSMutableCopying協(xié)議。
2.讓類實(shí)現(xiàn)copyWithZone:/mutableCopyWithZone:方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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