iOS 之NSDictionary深复制
来源:互联网 发布:mac怎么下载office 编辑:程序博客网 时间:2024/05/20 13:12
目标:把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
NSDictionary+MutableDeepCopy.m:
测试:
如果调用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
- #import <Foundation/Foundation.h>
- @interface NSDictionary (MutableDeepCopy)
- -(NSMutableDictionary *)mutableDeepCopy;
- //增加mutableDeepCopy方法
- @end
- #import <Foundation/Foundation.h>
- @interface NSDictionary (MutableDeepCopy)
- -(NSMutableDictionary *)mutableDeepCopy;
- //增加mutableDeepCopy方法
- @end
NSDictionary+MutableDeepCopy.m:
- #import "NSDictionary+MutableDeepCopy.h"
- @implementation NSDictionary (MutableDeepCopy)
- -(NSMutableDictionary *)mutableDeepCopy
- {
- NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]];
- //新建一个NSMutableDictionary对象,大小为原NSDictionary对象的大小
- NSArray *keys=[self allKeys];
- for(id key in keys)
- {//循环读取复制每一个元素
- id value=[self objectForKey:key];
- id copyValue;
- if ([value respondsToSelector:@selector(mutableDeepCopy)]) {
- //如果key对应的元素可以响应mutableDeepCopy方法(还是NSDictionary),调用mutableDeepCopy方法复制
- copyValue=[value mutableDeepCopy];
- }else if([value respondsToSelector:@selector(mutableCopy)])
- {
- copyValue=[value mutableCopy];
- }
- if(copyValue==nil)
- copyValue=[value copy];
- [dict setObject:copyValue forKey:key];
- }
- return dict;
- }
- @end
- #import "NSDictionary+MutableDeepCopy.h"
- @implementation NSDictionary (MutableDeepCopy)
- -(NSMutableDictionary *)mutableDeepCopy
- {
- NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]];
- //新建一个NSMutableDictionary对象,大小为原NSDictionary对象的大小
- NSArray *keys=[self allKeys];
- for(id key in keys)
- {//循环读取复制每一个元素
- id value=[self objectForKey:key];
- id copyValue;
- if ([value respondsToSelector:@selector(mutableDeepCopy)]) {
- //如果key对应的元素可以响应mutableDeepCopy方法(还是NSDictionary),调用mutableDeepCopy方法复制
- copyValue=[value mutableDeepCopy];
- }else if([value respondsToSelector:@selector(mutableCopy)])
- {
- copyValue=[value mutableCopy];
- }
- if(copyValue==nil)
- copyValue=[value copy];
- [dict setObject:copyValue forKey:key];
- }
- return dict;
- }
- @end
测试:
- #import <Foundation/Foundation.h>
- #import "NSDictionary+MutableDeepCopy.h"
- //导入头文件
- int main (int argc, const char * argv[])
- {
- @autoreleasepool {
- NSMutableArray *arr1=[[NSMutableArray alloc] initWithObjects:@"aa",@"bb",@"cc", nil];
- NSDictionary *dict1=[[NSDictionary alloc] initWithObjectsAndKeys:arr1,@"arr1", nil];
- NSLog(@"%@",dict1);
- NSMutableDictionary *dict2=[dict1 mutableCopy];
- //浅复制
- NSMutableDictionary *dict3=[dict1 mutableDeepCopy];
- //深复制
- [arr1 addObject:@"dd"];
- NSLog(@"%@",dict2);
- NSLog(@"%@",dict3);
- }
- return 0;
- }
0 0
- iOS 之NSDictionary深复制
- iOS/Objective-C开发 字典NSDictionary的深复制
- ios开发之NSDictionary
- IOS疯狂基础之NSDictionary
- IOS SDK详解之NSDictionary
- IOS SDK详解之NSDictionary
- IOS SDK详解之NSDictionary
- ios-基础之【8】-NSDictionary
- ios之NSDictionary使用集合
- iOS/Objective-C开发 字典NSDictionary的深复制(使用category)
- iOS/Objective-C开发 字典NSDictionary的深复制(使用category)
- iOS开发之CFMutableDictionaryRef 转 NSDictionary (__bridge NSDictionary *)
- iOS开发之深复制浅复制
- ios之NSDictionary、NSMutableDictionary使用小结
- IOS学习之NSDictionary和NSMutableDictionary详解
- iOS集合之NSDictionary与NSMutableDictionary
- ios之NSDictionary、NSMutableDictionary使用小结
- iOS开发之NSDictionary与NSMutableDictionary
- windowsphone中WebBrowser中的页面按级回退功能
- 即时通讯 视频会议开源技术选择
- windowsphone中WebBrowser中的页面按级回退功能
- 《深入C++面向对象模型》之拷贝构造函数
- Android 自定义View (四)
- iOS 之NSDictionary深复制
- ContentProvider案例
- 云
- 使用VS2008编译OpenCV2.2.0源码
- 多线程内存模型及同步和互斥简介
- WP7 如何禁用WebBrowser 控件缩放和左右移动
- platform平台总结
- iOS 之属性方法的选取原则
- 漫谈程序员系列:怎样成为技术达人