說到Copy 大多會想到淺復(fù)制(指針復(fù)制),深復(fù)制(內(nèi)容復(fù)制)鸵闪。
看一張圖:
你會發(fā)現(xiàn)對于集合類型怀愧,深復(fù)制那寫的是單層或者完全怔昨,這就有一個區(qū)分:
在OC中,當你對一個集合對象做深復(fù)制時署穗,這個深復(fù)制只是單層的寥裂,集合內(nèi)的元素對象其實還只是引用,并不是每一層都是深復(fù)制案疲,這一情況封恰,蘋果定義為單層深復(fù)制(one-level-deep copy)。只有對集合內(nèi)的每一層都去做深復(fù)制络拌,才能夠稱為完全深復(fù)制俭驮。
代碼驗證這一點,平時代碼:
NSArray *array = @[@[@"a", @"b"], @[@"c", @"d"];
NSArray *copyArray = [array copy];// 淺復(fù)制
NSMutableArray *mCopyArray = [array mutableCopy];// 單層深復(fù)制
NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *copyArray = [array copy];// 單層深復(fù)制春贸,返回不可變對象
NSMutableArray *mCopyArray = [array mutableCopy];// 單層深復(fù)制
那如果要做完全深復(fù)制該怎么做呢混萝?(已經(jīng)驗證)
一種方式為:
NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];
另外一種為歸檔和解檔(沒驗證)
NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
所以對于 如果是集合是內(nèi)容復(fù)制的話,集合里面的元素也是內(nèi)容復(fù)制么萍恕?這個問題也就有了答案了逸嘀。