国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

iOS/Objective-C開發(fā)字典NSDictionary的深復(fù)制(使用category)

2019-11-14 20:03:39
字體:
供稿:網(wǎng)友

目標(biāo):把NSDictionary對象轉(zhuǎn)換成NSMutableDictionary對象,對象內(nèi)容是字符串?dāng)?shù)組,需要實(shí)現(xiàn)完全復(fù)制(深復(fù)制)。 

如果調(diào)用NSDictionary的mutableCopy方法,可以得到一個(gè)NSMutableDictionary對象,但這只是淺復(fù)制,如果我們修改NSDictionary中數(shù)組內(nèi)的值(當(dāng)然,數(shù)組必須是NSMutableArray),會發(fā)現(xiàn),NSMutableDictionary對象內(nèi)數(shù)組的值也跟著更改了。我們需要增加一個(gè)mutableDeepCopy方法來實(shí)現(xiàn)深復(fù)制,在該方法中,循環(huán)復(fù)制每一個(gè)元素。 

要實(shí)現(xiàn)這一功能,有兩種方法,一是繼承,二是使用category。category與繼承的區(qū)別在于,使用category并不是新建一個(gè)類,而是在原類的基礎(chǔ)上增加一些方法(使用的時(shí)候還是用原類名),這樣,我們就不需要修改已經(jīng)在其他源文件中寫好的類名,只需要導(dǎo)入h頭文件,再把復(fù)制方法修改成我們新增的方法即可。 

一、新建Objective-C category文件,我這Category填MutableDeepCopy,Category on填NSDictionary,所以生成的文件是NSDictionary+MutableDeepCopy.h和NSDictionary+MutableDeepCopy.m,生成的文件名很容易理解。 

二、兩文件源代碼: 

NSDictionary+MutableDeepCopy.h 

C++代碼  收藏代碼
  1. #import <Foundation/Foundation.h>  
  2.    
  3. @interface NSDictionary (MutableDeepCopy)  
  4. -(NSMutableDictionary *)mutableDeepCopy;  
  5. //增加mutableDeepCopy方法  
  6. @end  


NSDictionary+MutableDeepCopy.m: 

C++代碼  收藏代碼
  1. #import "NSDictionary+MutableDeepCopy.h"  
  2.    
  3. @implementation NSDictionary (MutableDeepCopy)  
  4. -(NSMutableDictionary *)mutableDeepCopy  
  5. {  
  6.     NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]];  
  7.     //新建一個(gè)NSMutableDictionary對象,大小為原NSDictionary對象的大小  
  8.     NSArray *keys=[self allKeys];  
  9.     for(id key in keys)  
  10.     {//循環(huán)讀取復(fù)制每一個(gè)元素  
  11.         id value=[self objectForKey:key];  
  12.         id copyValue;  
  13.         if ([value respondsToSelector:@selector(mutableDeepCopy)]) {  
  14.             //如果key對應(yīng)的元素可以響應(yīng)mutableDeepCopy方法(還是NSDictionary),調(diào)用mutableDeepCopy方法復(fù)制  
  15.             copyValue=[value mutableDeepCopy];  
  16.         }else if([value respondsToSelector:@selector(mutableCopy)])  
  17.         {  
  18.             copyValue=[value mutableCopy];  
  19.         }  
  20.         if(copyValue==nil)  
  21.             copyValue=[value copy];  
  22.         [dict setObject:copyValue forKey:key];  
  23.    
  24.     }  
  25.     return dict;  
  26. }  
  27. @end  

 

 

測試: 

 

 

C++代碼  收藏代碼
  1. #import <Foundation/Foundation.h>  
  2. #import "NSDictionary+MutableDeepCopy.h"  
  3. //導(dǎo)入頭文件  
  4. int main (int argc, const char * argv[])  
  5. {  
  6.    
  7.     @autoreleasepool {  
  8.         NSMutableArray *arr1=[[NSMutableArray alloc] initWithObjects:@"aa",@"bb",@"cc", nil];  
  9.         NSDictionary *dict1=[[NSDictionary alloc] initWithObjectsAndKeys:arr1,@"arr1", nil];  
  10.         NSLog(@"%@",dict1);  
  11.         NSMutableDictionary *dict2=[dict1 mutableCopy];  
  12.         //淺復(fù)制  
  13.         NSMutableDictionary *dict3=[dict1 mutableDeepCopy];  
  14.         //深復(fù)制  
  15.         [arr1 addObject:@"dd"];  
  16.         NSLog(@"%@",dict2);  
  17.         NSLog(@"%@",dict3);  
  18.    
  19.     }  
  20.     return 0;  
  21. }  

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 锡林郭勒盟| 澄迈县| 涿州市| 凌云县| 金平| 宜昌市| 凤冈县| 南通市| 广州市| 治多县| 建湖县| 五莲县| 莱阳市| 徐闻县| 阜阳市| 勃利县| 西青区| 噶尔县| 德保县| 察雅县| 郑州市| 巴里| 家居| 化州市| 乡城县| 潞城市| 安丘市| 大埔县| 剑川县| 军事| 报价| 中山市| 宜黄县| 大同县| 驻马店市| 建德市| 老河口市| 天柱县| 山东| 乌鲁木齐县| 合作市|