嵌套深層Copy

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

 // 改內(nèi)置的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);
結(jié)果如下:
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)]) {
            //判斷元素是否是一個實現(xiàn)了mutableDeepCopyOfDictionary的字典
            elementCopy = [arrayElement mutableDeepCopyOfDictionary];
        }else if ([arrayElement respondsToSelector:@selector(mutableDeepCopyOfArray)]) {
            //判斷元素是否是一個實現(xiàn)了mutableDeepCopyOfDictionary的數(shù)組
            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
//為數(shù)組寫個分類
#import <Foundation/Foundation.h>

@interface NSArray (deepCopy)
//數(shù)組的深拷貝方法
-(NSMutableArray *)mutableDeepCopyOfArray;
@end


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

@implementation NSArray(deepCopy)

- (NSMutableArray *)mutableDeepCopyOfArray {
    //穿創(chuàng)建一個可變數(shù)組
    NSMutableArray *newArray = [NSMutableArray arrayWithCapacity:[self count]];
    
    for (int i = 0; i < [self count]; i++) {
        
        //取數(shù)組的一個元素
        id arrayElement = [self objectAtIndex:i];
        //用于接受添加的數(shù)組元素
        id elementCopy =nil;
        
        if ([arrayElement  respondsToSelector:@selector(mutableDeepCopyOfArray)]) {
            //判斷數(shù)組元素是否是一個實現(xiàn)了deepCopyOfArray方法的數(shù)組
            elementCopy = [arrayElement  mutableDeepCopyOfArray];
            
        }else if ([arrayElement    respondsToSelector:@selector(mutableDeepCopyOfDictionary)]) {
            //判斷數(shù)組元素是否是一個實現(xiàn)了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);

測試結(jié)果如下:
mutDic={
  ArrayOne =     (
       one,
        two
    );
    ArrayTwo =     (
        First,
        Second,
        Third
    );
    NameOne = LiLei;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市耻瑟,隨后出現(xiàn)的幾起案子食茎,更是在濱河造成了極大的恐慌无切,老刑警劉巖痹栖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甫菠,死亡現(xiàn)場離奇詭異蹦疑,居然都是意外死亡蚓挤,警方通過查閱死者的電腦和手機商源,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門车份,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牡彻,你說我怎么就攤上這事扫沼〕龅” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵缎除,是天一觀的道長严就。 經(jīng)常有香客問我,道長器罐,這世上最難降的妖魔是什么梢为? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮轰坊,結(jié)果婚禮上铸董,老公的妹妹穿的比我還像新娘。我一直安慰自己肴沫,他們只是感情好粟害,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颤芬,像睡著了一般悲幅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驻襟,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天夺艰,我揣著相機與錄音,去河邊找鬼沉衣。 笑死郁副,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豌习。 我是一名探鬼主播存谎,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肥隆!你這毒婦竟也來了既荚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤栋艳,失蹤者是張志新(化名)和其女友劉穎恰聘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吸占,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡晴叨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矾屯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兼蕊。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖件蚕,靈堂內(nèi)的尸體忽然破棺而出孙技,到底是詐尸還是另有隱情产禾,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布牵啦,位于F島的核電站亚情,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哈雏。R本人自食惡果不足惜势似,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望僧著。 院中可真熱鬧履因,春花似錦、人聲如沸盹愚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皆怕。三九已至毅舆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愈腾,已是汗流浹背憋活。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虱黄,地道東北人悦即。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像橱乱,于是被迫代替她去往敵國和親辜梳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉泳叠,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,709評論 0 9
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理作瞄,服務(wù)發(fā)現(xiàn),斷路器危纫,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 當(dāng)你寫一個應(yīng)用程序宗挥,你將不可避免地犯錯誤。 更糟糕的是种蝶,您的應(yīng)用程序設(shè)計中會時不時地出現(xiàn)錯誤契耿。 Xcode 的調(diào)試...
    titvax閱讀 683評論 0 0
  • R閱讀原書拆頁-結(jié)構(gòu)思考力P74 S(情景)需要讓對方產(chǎn)生共鳴,必須讓對方聽完以后產(chǎn)生一種“對對蛤吓,你說的沒錯”的反...
    Fly_Catkin閱讀 394評論 0 0
  • 今天在回家的路上想了想我為什么沒有完成任務(wù) 宵喂,主要是心態(tài)有問題吧糠赦! 給自己壓力太大每次當(dāng)同事收到定金時真的好著急...
    汪紫涵閱讀 138評論 0 0