说到Copy 大多会想到浅复制(指针复制),深复制(内容复制)。
看一张图:
你会发现对于集合类型,深复制那写的是单层或者完全,这就有一个区分:
在OC中,当你对一个集合对象做深复制时,这个深复制只是单层的,集合内的元素对象其实还只是引用,并不是每一层都是深复制,这一情况,苹果定义为单层深复制(one-level-deep copy)。只有对集合内的每一层都去做深复制,才能够称为完全深复制。
代码验证这一点,平时代码:
NSArray *array = @[@[@"a", @"b"], @[@"c", @"d"];
NSArray *copyArray = [array copy];// 浅复制
NSMutableArray *mCopyArray = [array mutableCopy];// 单层深复制
NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *copyArray = [array copy];// 单层深复制,返回不可变对象
NSMutableArray *mCopyArray = [array mutableCopy];// 单层深复制
那如果要做完全深复制该怎么做呢?(已经验证)
一种方式为:
NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];
另外一种为归档和解档(没验证)
NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
所以对于 如果是集合是内容复制的话,集合里面的元素也是内容复制么?这个问题也就有了答案了。