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

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

NSDictionary+MutableDeepCopy.m:

  1. #import "NSDictionary+MutableDeepCopy.h"
  2. @implementation NSDictionary (MutableDeepCopy)
  3. -(NSMutableDictionary *)mutableDeepCopy
  4. {
  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. return dict;
  24. }
  25. @end

测试:

  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. return 0;
  19. }

iOS/Objective-C开发 字典NSDictionary的深复制(使用category)的更多相关文章

  1. iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转

    iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转 1. 字典转Json字符串 // 字典转json字符串方法 -(NSString *)convertToJs ...

  2. iOS原生地图开发进阶——使用导航和附近兴趣点检索

    iOS原生地图开发进阶——使用导航和附近兴趣点检索 iOS中的mapKit框架对国际化的支持非常出色.在前些篇博客中,对这个地图框架的基础用法和标注与覆盖物的添加进行了详细的介绍,这篇博客将介绍两个更 ...

  3. IOS NS 字符串 数组 字典 文件 动态 静态 操作

    ios 常用字符串的操作   //将NSData转化为NSString        NSString* str = [[NSString alloc] initWithData:response e ...

  4. iOS中的深复制与浅复制

    很多语言中都有深复制浅复制的概念,如C++,ObjC等.简单来说,浅复制就是两个变量指向了同一块内存区域,深复制就是两个变量指向了不同的内存区域,但是两个内存区域里面的内容是一样的. 浅复制示意图: ...

  5. iOS 集合的深复制与浅复制

    概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...

  6. 从C#到Objective-C,循序渐进学习苹果开发(5)--利用XCode来进行IOS的程序开发

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.前面几篇随笔主要介绍C#和O ...

  7. iOS 浅复制、深复制、完全复制的知识点梳理验证(附加归档解档)

    在之前转载的一片文章中,文中对浅复制和深复制进行了详细的解读,同时还提到了深复制(one-level-deep copy).完全复制(true copy)的概念,并指出iOS开发中的深复制是单层深赋值 ...

  8. 利用XCode来进行IOS的程序开发

    利用XCode来进行IOS的程序开发 本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换 ...

  9. iOS项目——项目开发环境搭建

    在开发项目之前,我们需要做一些准备工作,了解iOS扩展--Objective-C开发编程规范是进行开发的必备基础,学习iOS学习--Xcode9上传项目到GitHub是我们进行版本控制和代码管理的选择 ...

随机推荐

  1. 跨越跳板机传文件nc

    从线上服务器与本机互传文件 传输方 nc -l 10000 < a.tar 接收方 nc xx.xx.xx.xx 10000 >a.tar 原理: 文件传输方运行nc,指定端口,设置监听文 ...

  2. Codeforces Round #198 (Div. 1) B,C 动态规划

    比赛时,开了大号去做,算了半天发现不会做A,囧.于是跑去看B,发现很水?于是很快敲完了,但是A不会,没敢交.于是去看C,一直找规律啊,后来总算调了出来,看了一下榜,发现还是算了吧,直接去睡觉了.第二天 ...

  3. html+CSS--水平居中设置(定宽块状元素)

    来源:http://www.imooc.com/code/4336 当被设置元素为 块状元素 时用 text-align:center 就不起作用了,这时也分两种情况:定宽块状元素和不定宽块状元素. ...

  4. css 雪碧图的制作

    很多网站其实都用了雪碧图,确实方便了制作,以前以为这种小图标,都是一个一个图片呢(笑) 效果图如下: 代码如下: <html> <head lang="en"&g ...

  5. oracle中的instr()

    INSTR (源字符串, 目标字符串, 起始位置, 匹配序号) 在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置.只检索一次,就是说从字符的开始 到字符的结尾就结束. ...

  6. Table of Contents - JMS

    JMS Specification v1.1 JMS 基本概念 Message QueueBrowser 消息选择器 消息确认 ConnectionMetaData ExceptionListener ...

  7. Table of Contents - HTTP

    HTTP 报文 HTTP 方法 HTTP 状态码 HTTP 首部 连接管理 持久连接 Cookie 机制 Session 机制 基本认证机制 在 Tomcat 中设置基本认证 摘要认证 在 Tomca ...

  8. 用Drawing画图如何不会消失

    方法一:将事件放在form_Load中,在窗体中画图   1: protected void MainForm_Load(object sender,EventArgs e) 2: { 3: Init ...

  9. iOS UILabel自定义行间距时获取高度

    本文介绍一下自定义行间距的UILabel的高度如何获取,需要借助一下开源的UILabel控件:TTTAttributedLabel 附下载地址 https://github.com/TTTAttrib ...

  10. QA在网站建设中的作用

    在网站建设项目中,有一个团队负责产品测试并识别产品中的缺陷是很有意义的.问题在于,不应该只依赖这个团队来发现所有的缺陷,就像航空公司不能只依靠空乘人员确保飞机安全一样.这个观点的核心是一个简单的事实, ...