OC中自定义类的NSCopying实现的注意事项(isEqual & hash实现)
2016-07-25 22:55
381 查看
在OC中,如果自定义类,则要考虑赋值、持久化保存、保存到其它容器中等各种情况的对象复制和比较,下面是一个比较全面的自定义例子,在此仅作记录:
自定义类:
KeyValuePairs.h:
KeyValuePairs.m:
测试:
注意:
1、如果自定义类不实现NSCopying则无法进行持久化保存(到文件)、或错误赋值
2、如果自定义类不重写isEqual则默认使用内存地址比较两个对象,可能会出现意想不到的结果
3、isEqual和hash方法要同时重写,否则isEqual方法判断将不正确
自定义类:
KeyValuePairs.h:
#import <Foundation/Foundation.h> @interface KeyValuePairs: NSObject <NSCopying> @property (nonatomic,strong)NSString *identifier; @property (nonatomic,strong)NSString *name; @end
KeyValuePairs.m:
#import "KeyValuePairs.h" @implementation KeyValuePairs - (id)copyWithZone:(NSZone *)zone { KeyValuePairs *kvp = [[[self class] allocWithZone:zone] init]; kvp.identifier = self.identifier; kvp.name = self.name; return kvp; } - (BOOL)isEqualToKeyValuePairs:(KeyValuePairs *)kvp{ if (!kvp) { return NO; } BOOL haveEqualName = (!self.name && !kvp.name) || [self.name isEqualToString:kvp.name]; BOOL haveEqualIdentifier = (!self.identifier && !kvp.identifier) || [self.identifier isEqualToString:kvp.identifier]; return haveEqualName && haveEqualIdentifier; } #pragma mark -NSObject -(BOOL)isEqual:(id)object{ if (self == object) { return YES; } if (![object isKindOfClass:[KeyValuePairs class]]) { return NO; } return [self isEqualToKeyValuePairs:(KeyValuePairs *)object]; } - (NSUInteger)hash { return [self.name hash] ^ [self.identifier hash]; } @end
测试:
NSMutableDictionary *namesWillUpdateDic = [[NSMutableDictionary alloc] init]; NSMutableArray *names = [[NSMutableArray alloc] init]; for (int i = 0; i<1000; i++) { NSString *name = [NSString stringWithFormat:@"%d_zhangsan",i]; NSString *identifier = [NSString stringWithFormat:@"%d_identifier",i]; NSString *strObj = [NSString stringWithFormat:@"%d_strObj",i]; KeyValuePairs *kvp = [[KeyValuePairs alloc] init]; kvp.identifier = identifier; kvp.name = name; [namesWillUpdateDic setObject:strObj forKey:kvp]; [names addObject:kvp]; } for (int j = 0; j<1000; j++) { int index = arc4random()%1000; KeyValuePairs *kvp = [names objectAtIndex:index]; NSString *strObj = [namesWillUpdateDic objectForKey:kvp]; NSString *msg = [NSString stringWithFormat:@"index:%d,identifier:%@,email:%@,strObj:%@",index,kvp.identifier,kvp.name,strObj]; NSLog(@"%@",msg); }
注意:
1、如果自定义类不实现NSCopying则无法进行持久化保存(到文件)、或错误赋值
2、如果自定义类不重写isEqual则默认使用内存地址比较两个对象,可能会出现意想不到的结果
3、isEqual和hash方法要同时重写,否则isEqual方法判断将不正确
相关文章推荐
- vmware +ubuntu+xshell+vim
- linux 关于数据库的部分命令
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
- Linux中常用操作命令
- Linux学习——守护进程(daemon)
- Centos 6.x运行级别、修改方法和关机重启命令
- linux基础——linux线程间通信及同步机制总结
- linux下 启动node 和关闭node
- CentOS系统根目录组织结构
- Linux内核中的atoi,itoa等函数
- linux安装、卸载jdk及配置环境变量
- linux 下安装nodejs
- Linux下串口编程入门
- Linux文件操作常用命令整理
- 直接双击启动tomcat中的startup.bat闪退原因及解决方法
- centos镜像文件下载地址
- CentOS下TFTP服务安装
- linux命令rpm
- 网站开发基础知识篇 一HTML及相关标签
- centOS 6.x 版本安装 node.js 4.x 以上版本的方法