嵌套深层Copy

遇到问题:
NSDictionary *dic = [NSDictionary  dictionaryWithObjectsAndKeys:@"LiLei",@"NameOne",
                         [NSArray  arrayWithObjects:@"one",@"two",nil],@"ArrayOne",
                         [NSArray  arrayWithObjects:@"First",@"Second",nil],@"ArrayTwo", nil];
NSMutableDictionary *mutDic = [dic  mutableDeepCopyOfDictionary];

 // 改内置的ArrayTwo
NSMutableArray *mutArr = (NSMutableArray *)[mutDic objectForKey:@"ArrayTwo"];
    [mutArr addObject:@"Third"];

  NSLog(@"mutDic=%@", mutDic);

reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x7fe8d36911e0'

简单的解决办法,解决少量的问题
NSDictionary *dic = [NSDictionary  dictionaryWithObjectsAndKeys:@"LiLei",@"NameOne",
                         [NSArray  arrayWithObjects:@"one",@"two",nil],@"ArrayOne",
                         [NSArray  arrayWithObjects:@"First",@"Second",nil],@"ArrayTwo", nil];
    NSMutableDictionary *mutDic = [dic  mutableCopy];
   
    NSMutableArray *mutArr = [NSMutableArray arrayWithArray:[mutDic objectForKey:@"ArrayTwo"]];
   
    [mutArr addObject:@"Third"];  
    [mutDic setValue:mutArr forKey:@"ArrayTwo"]; 
     NSLog(@"mutDic=%@", mutDic);
结果如下:
mutDic={
  ArrayOne =     (
       one,
        two
    );
    ArrayTwo =     (
        First,
        Second,
        Third
    );
    NameOne = LiLei;
}
如果要对多个元素更改的话,建议下面的
//为字典写个分类
#import <Foundation/Foundation.h>

@interface NSDictionary (deepCopy)
//字典的深拷贝
- (NSMutableDictionary *) mutableDeepCopyOfDictionary;
@end


#import "NSDictionary+deepCopy.h"
#import "NSArray+deepCopy.h"

@implementation NSDictionary (deepCopy)
- (NSMutableDictionary *) mutableDeepCopyOfDictionary{
    
    //实例化一个可变的字典
    NSMutableDictionary *newDict = [NSMutableDictionary  dictionaryWithCapacity:[self  count]];
    //获取字典的所有键
    NSArray *keys = [self  allKeys];
    
    for (id key  in keys) {
        
        //取出字典的元素
        id arrayElement = [self  valueForKey:key];
        id elementCopy =nil;
        if ([arrayElement   respondsToSelector:@selector(mutableDeepCopyOfDictionary)]) {
            //判断元素是否是一个实现了mutableDeepCopyOfDictionary的字典
            elementCopy = [arrayElement mutableDeepCopyOfDictionary];
        }else if ([arrayElement respondsToSelector:@selector(mutableDeepCopyOfArray)]) {
            //判断元素是否是一个实现了mutableDeepCopyOfDictionary的数组
            elementCopy = [arrayElement   mutableDeepCopyOfArray] ;
        }else if ([arrayElement conformsToProtocol:@protocol(NSMutableCopying)]) {
            elementCopy = [arrayElement   mutableCopy];
        }
    
        if (elementCopy ==nil) {
            elementCopy = [arrayElement  copy];
        }
        [newDict setObject:elementCopy  forKey:key];
    }
    return newDict;
}

@end
//为数组写个分类
#import <Foundation/Foundation.h>

@interface NSArray (deepCopy)
//数组的深拷贝方法
-(NSMutableArray *)mutableDeepCopyOfArray;
@end


#import "NSArray+deepCopy.h"
#import "NSDictionary+deepCopy.h"

@implementation NSArray(deepCopy)

- (NSMutableArray *)mutableDeepCopyOfArray {
    //穿创建一个可变数组
    NSMutableArray *newArray = [NSMutableArray arrayWithCapacity:[self count]];
    
    for (int i = 0; i < [self count]; i++) {
        
        //取数组的一个元素
        id arrayElement = [self objectAtIndex:i];
        //用于接受添加的数组元素
        id elementCopy =nil;
        
        if ([arrayElement  respondsToSelector:@selector(mutableDeepCopyOfArray)]) {
            //判断数组元素是否是一个实现了deepCopyOfArray方法的数组
            elementCopy = [arrayElement  mutableDeepCopyOfArray];
            
        }else if ([arrayElement    respondsToSelector:@selector(mutableDeepCopyOfDictionary)]) {
            //判断数组元素是否是一个实现了deepCopyOfArray方法的字典
            elementCopy = [arrayElement  mutableDeepCopyOfDictionary];
        }else if ([arrayElement conformsToProtocol:@protocol(NSMutableCopying)]) {
            elementCopy = [arrayElement  mutableCopy];
        }
        if (elementCopy ==nil) {
            elementCopy = [arrayElement copy];
        }
        [newArray   addObject:elementCopy];
        
    }
    return newArray;
}
@end


#import "NSArray+deepCopy.h"
#import "NSDictionary+deepCopy.h"

NSDictionary *dic = [NSDictionary  dictionaryWithObjectsAndKeys:@"LiLei",@"NameOne",
                         [NSArray  arrayWithObjects:@"one",@"two",nil],@"ArrayOne",
                         [NSArray  arrayWithObjects:@"First",@"Second",nil],@"ArrayTwo", nil];
NSMutableDictionary *mutDic = [dic  mutableDeepCopyOfDictionary];

NSMutableArray *mutArr = (NSMutableArray *)[mutDic objectForKey:@"ArrayTwo"];
    [mutArr addObject:@"Third"];

 NSLog(@"mutDic=%@", mutDic);

测试结果如下:
mutDic={
  ArrayOne =     (
       one,
        two
    );
    ArrayTwo =     (
        First,
        Second,
        Third
    );
    NameOne = LiLei;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,831评论 0 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,404评论 19 139
  • 当你写一个应用程序,你将不可避免地犯错误。 更糟糕的是,您的应用程序设计中会时不时地出现错误。 Xcode 的调试...
    titvax阅读 3,994评论 0 0
  • R阅读原书拆页-结构思考力P74 S(情景)需要让对方产生共鸣,必须让对方听完以后产生一种“对对,你说的没错”的反...
    Fly_Catkin阅读 2,939评论 0 0
  • 今天在回家的路上想了想我为什么没有完成任务 ,主要是心态有问题吧! 给自己压力太大每次当同事收到定金时真的好着急...
    汪紫涵阅读 936评论 0 0