目标:把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
#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 <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;
}
分享到:
相关推荐
是关于iOS开发语言部分Objective-C中字典对象NSDictionary的方法使用总结
《Objective-C程序设计》(作者杨正洪、郑齐心、李建国)通过大量的实例系统地介绍了Objective-C语言的基本概念、语法规则、框架、类库及开发环境。读者在阅读本书后,可以掌握Objective-C语言的基本内容,并进行...
Objective-C&Swift库可以轻松将NSDictionary映射到模型对象,与Alamofire完美配合。 ObjectMapper与GSON类似
Objective-C-如何创建和使用NSDictionary和NSMutableDictionary-Latest-2017-Hindi- 视频:-Yogesh Patel在Objective-C中使用NSDictionary和NSMutableDictionary的介绍。 在本频道中,我将在多部视频中讲授大多数...
主要介绍了Objective-C中NSNumber与NSDictionary的用法简介,虽然Objective-C即将不再是iOS的主流开发语言...well,需要的朋友可以参考下
块是Objective-C对象,也就是说它们可以被添加到像NSArray和NSDictionary这样的集合中,其还具有从封闭范围捕获值的能力。源码github.com/pro648/BasicDemos-iOS/tree/master/Block 块是一个独立的代码片段,...
C Model、NSDictionary、JSON之间互相转换,框架非常简单高效,内部对反射过的model设置有缓存,用Objective-C中的Protocol限定NSArray,NSDictionary等容器类的类型,防止容器类型变量类型使用错误,类似Java中容器...
详情请参见我的博文: http://blog.csdn.net/yang3wei/article/details/7804171
JSON Web 令牌的 Objective-c 实现。 在 iOS/MacOS 应用程序上编码和解码 JWT 的简单方法。 哈希算法 SHA256 SHA384 SHA512 应用程序接口 + (NSString *) encodeWithPayload:(NSDictionary *) andKey:...
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if (...
ios demo,NSDictionary toJSONString,字典转换到JSONString
JKCategories(iOS-Categories),是有用的Objective-C类别的集合,这些类别扩展了iOS框架,例如Foundation,UIKit,CoreData,QuartzCore,CoreLocation,MapKit等。 要求 该库需要iOS 7.0+和Xcode 8.0+ 。 安装 ...
开发中经常需要打印日志以查看数据是否正确,或者说查看数据的格式。但是,苹果对于我们的NSDictionary、NSSet、NSArray等值有中文时,打印出来的是Unicode编码,人类无法直接读懂,因此,笔者研究研究如何将打印...
支持新的Objective-C语法,如字面NSDictionary、字面NSArray、字面NSNumber,字面NSDictionary的语法与Objective-C不同,考虑lua语法; 支持枚举集合的语法(for-in 语法); 添加一些扩展,例如@array、@...
缓存LRU 缓存的Objective-C 实现。 描述通过键提供对最近使用的对象的轻松访问(内部使用的 NSDictionary 和 Linked List)。 如果缓存空间不足,则自动删除最近最少使用的对象。线程安全从缓存中追加和接收元素是...
适用于 iOS 的 MYO SDK 下的 #WTMyo-Objective-C-iOS Wrapper。 需要在项目中添加Myo.framework - ##Info 这是一个小包装器,可帮助您从 Myo 设备控制手势。 观察者功能已更改为委托。 ####WTMyoDelegate #####...
各种 InSeven Limited 库和项目中使用的 Objective-C 实用程序类。 安装 ISUtilities 可通过: platform: ios, '6.0' pod "ISUtilities", "~> 1.1" 文档 上提供了编译文档。 通过从存储库的根目录执行以下命令,...
Keychain-iOS-ObjC是用于在iOS中使用Keychain的简单Objective-C包装器, KFKeychain类能够保存,加载和从iOS Keychain中删除任意对象,包括NSString和NSDictionary 。 例子 假设我们要在iOS钥匙串中存储用户授权...