浅拷贝和深拷贝
目录
- 对浅拷贝和深拷贝的理解
- 浅拷贝
- 深拷贝
- NSDictionary的深拷贝
对浅拷贝和深拷贝的理解
浅拷贝
不是深拷贝的拷贝都是浅拷贝
深拷贝
如果想使用copy则需要遵循NSCopying协议,如果是想使用mutableCopy则需要遵循NSMutableCopying协议
分别需要实现的方法
- (id)copyWithZone:(NSZone *)zone{ MyClass *myClass = [[self class] allocWithZone:zone] init]; 对新创建的对象进行copy/mutableCopy赋值; return myClass;}
- (id)mutableCopyWithZone:(NSZone *)zone{ MyClass *myClass = [[self class] allocWithZone:zone] init]; 对新创建的对象进行copy/mutableCopy赋值; return myClass;}
如果类里面又包含其他类对象,则需要对这些类对象的类实现NSCopying协议或者NSMutableCopying协议,如此类推
NSDictionary的深拷贝
-(NSMutableDictionary *)mutableDeepCopy
{
NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]];
//新建一个NSMutableDictionary对象,大小为原NSDictionary对象的大小
NSArray *keys=[self allKeys];
for(id key in keys)
{ //循环读取复制每一个元素
id value=[self objectForKey:key];
id copyValue;
if ([value respondsToSelector:@selector(mutableDeepCopy)]) {
//如果key对应的元素可以响应mutableDeepCopy方法(还是NSDictionary),调用mutableDeepCopy方法复制
copyValue=[value mutableDeepCopy];
}else if([value respondsToSelector:@selector(mutableCopy)])
{
copyValue=[value mutableCopy];
}
if(copyValue==nil)
copyValue=[value copy];
[dict setObject:copyValue forKey:key];
}
return dict;
}