//聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄
一、淺拷貝概念
1.淺拷貝:只是拷貝了對象的指針脓杉,而不是拷貝對象本身糟秘。
2.在Objective-C中,通過兩個方法 ?copy和mutableCopy可以執(zhí)行拷貝操作球散,其中copy是獲得一個不可變對象尿赚,而mutableCopy是獲得一個可變對象。
3.并且兩個方法分別調(diào)用copyWithZone和mutableCopyWithZone兩個方法來進(jìn)行拷貝操作沛婴,一個類必須實(shí)現(xiàn)copyWithZone或者mutableCopyWithZone吼畏,才能進(jìn)行copy或者mutableCopy
如圖:
二、淺拷貝代碼實(shí)現(xiàn)
淺拷貝有很多中方法嘁灯,當(dāng)你進(jìn)行淺拷貝時,會向原始的集合發(fā)送retain消息泻蚊,這時引用計數(shù)就會 +1 ,同時指針就被拷貝到新的集合中去丑婿。
NSArray*shallowCopyArray = [someArray copyWithZone:nil];
NSDictionary*shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:NO];
注意:如果集合里的對象都遵循NSCopying協(xié)議性雄,那么對象就會被深拷貝到新的集合。如果對象沒有遵循NSCopying協(xié)議羹奉,而嘗試用這種方法進(jìn)行深拷貝秒旋,會在運(yùn)行時出錯。
三诀拭、淺拷貝迁筛、深拷貝、完全拷貝區(qū)別:
* 淺拷貝(shallow copy): ? ? ? ? ? ? ? 在淺拷貝操作時耕挨,對于被拷貝對象的每一層都是指針拷貝细卧。
* 深拷貝(one-level-deep copy):在深拷貝操作時,對于被拷貝對象筒占,至少有一層是深拷貝贪庙。
* 完全拷貝(real-deep copy): ? ? ? 在完全拷貝操作時,對于被拷貝對象的每一層都是對象拷貝
四翰苫、系統(tǒng)對象的拷貝
不管是集合類對象止邮,還是非集合類對象这橙,當(dāng)接收到copy和mutableCopy消息時,都遵循以下準(zhǔn)則:
copy返回不可變對象(immutable)导披;所以屈扎,如果對copy返回值使用mutable對象接口就會crash;
mutableCopy返回可變對象(mutable);