zoukankan      html  css  js  c++  java
  • iOS/Objective-C开发 字典NSDictionary的深复制(使用category)

    目标:把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 

    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.     //新建一个NSMutableDictionary对象,大小为原NSDictionary对象的大小  
    8.     NSArray *keys=[self allKeys];  
    9.     for(id key in keys)  
    10.     {//循环读取复制每一个元素  
    11.         id value=[self objectForKey:key];  
    12.         id copyValue;  
    13.         if ([value respondsToSelector:@selector(mutableDeepCopy)]) {  
    14.             //如果key对应的元素可以响应mutableDeepCopy方法(还是NSDictionary),调用mutableDeepCopy方法复制  
    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. //导入头文件  
    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.         //浅复制  
    13.         NSMutableDictionary *dict3=[dict1 mutableDeepCopy];  
    14.         //深复制  
    15.         [arr1 addObject:@"dd"];  
    16.         NSLog(@"%@",dict2);  
    17.         NSLog(@"%@",dict3);  
    18.    
    19.     }  
    20.     return 0;  
    21. }  
  • 相关阅读:
    lua 生成随机数
    lau--- and or运算
    一次Exchange邮箱接口的开发经历
    SQL Server分页查询进化史
    一次.NET项目反编译的实战经验(WinForm)
    点石成金-访客至上的网站设计秘笈 读书笔记
    Windows7使用无线网卡建立WiFi热点
    程序员的职业素养 读书笔记
    程序员的职业素养 读书笔记
    程序员的职业素养 读书笔记
  • 原文地址:https://www.cnblogs.com/lovewx/p/3966691.html
Copyright © 2011-2022 走看看