前言
首先我們要先明白一個概念鸯两,什么是淺復(fù)制宣吱,單層深復(fù)制哼转,完全復(fù)制(每一層都深復(fù)制)
淺復(fù)制也就是所說的指針復(fù)制明未,并沒有進行對象復(fù)制
單層深復(fù)制,也就是我們經(jīng)常說的深復(fù)制壹蔓,我這里說的單層深復(fù)制是對于集合類所說的(即NSArray,NSDictionary,NSSet)趟妥,單層深復(fù)制指的是只復(fù)制了該集合類的最外層,里邊的元素沒有復(fù)制佣蓉,(即這兩個集合類的地址不一樣披摄,但是兩個集合里所存儲的元素的地址是一樣的)
完全復(fù)制,指的是完全復(fù)制整個集合類勇凭,也就是說兩個集合地址不一樣疚膊,里邊所存儲的元素地址也不一樣
明白了這三個概念之后,我們就來說一下他們的區(qū)別所在:
- 非集合類(NSString虾标,NSNumber)
[immutableObject copy] //淺復(fù)制
[immutableObject mutableCopy] //深復(fù)制
[mutableObject copy] //深復(fù)制
[mutableObject mutableCopy] //深復(fù)制
結(jié)論:不可變進行copy是淺復(fù)制寓盗,mutableCopy是深復(fù)制,可變的copy璧函,mutableCopy都是深復(fù)制
- 集合類(NSArray傀蚌,NSDictionary, NSSet)
[immutableObject copy] //淺復(fù)制
[immutableObject mutableCopy] //單層深復(fù)制
[mutableObject copy] //單層深復(fù)制
[mutableObject mutableCopy] //單層深復(fù)制
結(jié)論:不可變進行copy是淺復(fù)制,mutableCopy是單層深復(fù)制蘸吓,可變的copy善炫,mutableCopy都是單層深復(fù)制
那么如何實現(xiàn)多層復(fù)制呢?
我們以NSArray舉例說明
NSArray *copyArray = [[NSArray alloc] initWithArray:array copyItems:YES]; // 完全復(fù)制
需要特別注意的是
以上我們所說的兩種情況默認都實現(xiàn)了NSCopying和NSMutableCopying協(xié)議
對于自定義繼承自NSObject的類
- copy需要實現(xiàn)NSCopying協(xié)議库继,然后實現(xiàn)以下方法箩艺,否則copy會crash
-(id)copyWithZone:(NSZone *)zone {
CopyObject *copy = [[[self class] alloc] init];
copy.name = self.name;
copy.mobile = self.mobile;
copy.company = self.company;
copy.descInfo = self.descInfo;
return copy;
}
- mutableCopy時,需要實現(xiàn)NSMutableCopying協(xié)議宪萄,否則mutableCopy會crash
-(id)mutableCopyWithZone:(NSZone *)zone {
MutableCopyObject *mutableCopy = [[[self class] alloc] init];
mutableCopy.name = self.name;
mutableCopy.mobile = self.mobile;
mutableCopy.company = self.company;
mutableCopy.descInfo = self.descInfo;
return mutableCopy;
}