×
广告

NSMutableDictionary 实现完全深拷贝

96
Liberalism
2017.10.26 19:30* 字数 168

概念性的东西我们不讲了,我们都知道集合类的拷贝比较特殊,对集合类进行 Deep Copy其实并不是完整的深拷贝,只是拷贝了外面的容器,里面的指针并没有被拷贝。道理大家都懂,可平时用的少,前几天我就栽了个跟头,特此记录一下。

网上有现成的解决方案,特此解读

  1. 遍历字典中所有的键值对
  2. 如果还是字典,继续遍历轮询
  3. 不是字典,采取 mutableCopy
  4. 无法执行 Copy 的需要进行特殊处理,例如 UIImage
-(NSMutableDictionary *)mutableDeepCopy
{
    NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]];

    NSArray *keys=[self allKeys];
    
    for(id key in keys)
    {
        id value=[self objectForKey:key];
        
        id copyValue;
        
        if ([value respondsToSelector:@selector(mutableDeepCopy)])
        {
            copyValue=[value mutableDeepCopy];
        }
        else if([value respondsToSelector:@selector(mutableCopy)])
        {
            if ([value isMemberOfClass:[UIImage class]])
            {
                continue;
            }
            copyValue=[value mutableCopy];
        }
        
        if(copyValue==nil)
        {
            copyValue=[value copy];
        }
            
        [dict setObject:copyValue forKey:key];
    }
    return dict;
}
工作笔记
Web note ad 1