NSMutableDictionary 实现完全深拷贝

概念性的东西我们不讲了,我们都知道集合类的拷贝比较特殊,对集合类进行 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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容