小编致力于用精简的语言说明不精简的问题
一、概念
- 浅复制:拷贝指向对象的指针
- 深复制:拷贝对象到另一块内存中
二、对象拷贝遵循规则
无论是集合类型NSArray、NSDictionary、NSSet ...,还是非集合类型NSString, NSNumber ... 对象,调用copy、mutableCopy方法时:
- copy永远返回不可变对象
- mutableCopy永远返回可变对象
- 对于不可变对象进行copy操作,是指针赋值
- 对于对象(无论可变不可变)进行mutableCopy操作,都是内容赋值
注:下面代码是对的,只是改变了str对象的指针
NSString *str = @"string";
str = @"newString";
三、集合拷贝遵循规则
3.1.集合的浅复制
- 进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合
- 浅复制代码举例
NSArray *shallowCopyArray = [someArray copyWithZone:nil];
NSSet *shallowCopySet = [NSSet mutableCopyWithZone:nil];
NSDictionary *shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:NO];
3.2.集合的深复制
方法1:initWithArray:copyItems:
- 集合里的每个对象都会收到 copyWithZone: 消息。如果对象遵循 了NSCopying 协议,就会被深复制到新的集合。如果没有,用这种方法进行深复制,在运行时就会出错。copyWithZone: 方法只能够提供一层拷贝,而非真正的深拷贝
NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];
方法2:归档之后解挡
NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
3.3.集合的单层深复制 (one-level-deep copy)
在多层数组中,对第一层进行内容拷贝,其它层进行指针拷贝
参考资料:
深复制与浅复制解析
网友评论