iOS/Objective-C开发 字典NSDictionary的深复制(使用category)

来源:互联网 发布:windows education 编辑:程序博客网 时间:2024/06/08 09:49
目标:把NSDictionary对象转换成NSMutableDictionary对象,对象内容是字符串数组,需要实现完全复制(深复制)。
如果调用NSDictionary的mutableCopy方法,可以得到一个NSMutableDictionary对象,但这只是浅复制,如果我们修改NSDictionary中数组内的值(当然,数组必须是NSMutableArray),会发现,NSMutableDictionary对象内数组的值也跟着更改了。我们需要增加一个mutableDeepCopy方法来实现深复制,在该方法中,循环复制每一个元素。
要实现这一功能,有两种方法,一是继承,二是使用category。category与继承的区别在于,使用category并不是新建一个类,而是在原类的基础上增加一些方法(使用的时候还是用原类名),这样,我们就不需要修改已经在其他源文件中写好的类名,只需要导入h头文件,再把复制方法修改成我们新增的方法即可。
一、新建Objective-C category文件,我这Category填MutableDeepCopy,Category on填NSDictionary,所以生成的文件是NSDictionary+MutableDeepCopy.h和NSDictionary+MutableDeepCopy.m,生成的文件名很容易理解。
二、两文件源代码:

NSDictionary+MutableDeepCopy.h

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


NSDictionary+MutableDeepCopy.m:

oc代码 复制代码 收藏代码
  1. #import "NSDictionary+MutableDeepCopy.h" 
  2.   
  3. @implementation NSDictionary (MutableDeepCopy) 
  4. -(NSMutableDictionary *)mutableDeepCopy 
  5.     NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]]; 
  6.     //新建一个NSMutableDictionary对象,大小为原NSDictionary对象的大小 
  7.     NSArray *keys=[self allKeys]; 
  8.     for(id key in keys) 
  9.     {//循环读取复制每一个元素 
  10.         id value=[self objectForKey:key]; 
  11.         id copyValue; 
  12.         if ([value respondsToSelector:@selector(mutableDeepCopy)]) { 
  13.             //如果key对应的元素可以响应mutableDeepCopy方法(还是NSDictionary),调用mutableDeepCopy方法复制 
  14.             copyValue=[value mutableDeepCopy]; 
  15.         }else if([value respondsToSelector:@selector(mutableCopy)]) 
  16.         { 
  17.             copyValue=[value mutableCopy]; 
  18.         } 
  19.         if(copyValue==nil) 
  20.             copyValue=[value copy]; 
  21.         [dict setObject:copyValue forKey:key]; 
  22.   
  23.     } 
  24.     return dict; 
  25. @end 


测试:
oc代码 复制代码 收藏代码
  1. #import <Foundation/Foundation.h> 
  2. #import "NSDictionary+MutableDeepCopy.h" 
  3. //导入头文件 
  4. int main (int argc,const char * argv[]) 
  5.   
  6.     @autoreleasepool { 
  7.         NSMutableArray *arr1=[[NSMutableArray alloc] initWithObjects:@"aa",@"bb",@"cc", nil]; 
  8.         NSDictionary *dict1=[[NSDictionary alloc] initWithObjectsAndKeys:arr1,@"arr1", nil]; 
  9.         NSLog(@"%@",dict1); 
  10.         NSMutableDictionary *dict2=[dict1 mutableCopy]; 
  11.         //浅复制 
  12.         NSMutableDictionary *dict3=[dict1 mutableDeepCopy]; 
  13.         //深复制 
  14.         [arr1 addObject:@"dd"]; 
  15.         NSLog(@"%@",dict2); 
  16.         NSLog(@"%@",dict3); 
  17.   
  18.     } 
  19.     return 0; 

 

 

http://daisy-sea.iteye.com/blog/1567765