iOS之《Effective Objective-C 2.0》读书笔记(8)
来源:互联网 发布:金太阳手机炒股软件 编辑:程序博客网 时间:2024/05/29 03:51
第八条:理解“对象等同性”这一概念
1.“==”
(1)对于对象类型,`==“比较的是对象的地址,即是否为同一个对象
NSString *str = @"test1";NSString *strCopy = [str copy];NSString *strNew = [NSString stringWithFormat:@"test%@", @1];BOOL equalA = (str == strCopy); // YESBOOL equalB = (str == strNew); // NO
(2)对于基本类型,==比较的是值
NSInteger x = 123;NSInteger y = 123;NSInteger z = 1234;BOOL equal0 = (x == y); // YESBOOL equal1 = (x == z); // NO
2.isEqual
(1) isEqual:NSObject 协议中声明的方法来判断两个对象的等同性,可直接使用
NSString *str = @"test1";NSString *strNew = [NSString stringWithFormat:@"test%@", @1];BOOL equalD = [str isEqual:strNew]; // YES
(2)iOS系统已经实现了部分NSObject子类的isEqual方法,可直接使用
NSString - isEqualToStringNSArray - isEqualToArrayNSDictionary - isEqualToDictionaryNSSet - isEqualToSet
(3)对于自定义的类型来说,需要重写isEqual方法:
//重写系统的isEqual- (BOOL)isEqual:(id)object { //Step 1: ==运算符判断是否是同一对象, 因为同一对象必然完全相同 if (self == object) { return YES; } //Step 2: 判断是否是同一类型, 这样不仅可以提高判等的效率, 还可以避免隐式类型转换带来的潜在风险 if (![object isKindOfClass:[Person class]]) { return NO; } //Step 3: 通过封装的isEqualToPerson方法, 提高代码复用性 return [self isEqualToPerson:(Person *)object];}//自定义方法来执行有意义的值比较- (BOOL)isEqualToPerson:(Person *)person { //Step 4: 判断person是否是nil, 做参数有效性检查 if (!person) { return NO; } //Step 5: 对各个属性分别使用默认判等方法进行判断 BOOL haveEqualNames = (!self.name && !person.name) || [self.name isEqualToString:person.name]; BOOL haveEqualBirthdays = (!self.birthday && !person.birthday) || [self.birthday isEqualToDate:person.birthday]; //Step 6: 返回所有属性判等的与结果 return haveEqualNames && haveEqualBirthdays;}
(4)isEqual和hash的联系:如果 isEqual: 方法判断两个对象相等,那么其 hash 方法必须返回同一个值
3.hash
(1)哈希表:hash表是一种特殊的数据结构,能够快速定位到想要查找的记录
***在数组中查找某个成员1》 遍历数组中的成员2》 将取出的值与目标值比较, 如果相等, 则返回该成员***使用hash1》 通过hash值直接找到查找目标的位置2》 如果目标位置上有多个相同hash值得成员, 此时再按照数组方式进行查找结论:若是无多个相同hash值的成员,使用hash查找较快
(2)hash方法什么时候被调用:
//对象被添加至NSSet[set1 addObject:person1];// 设置为NSDictionary的key[dictionaryValue2 setObject:person2 forKey:kKey2];
(3)hash方法与isEqual的关系:hash值是对象判等的必要非充分条件
1》 先判断hash是否相等,如果不相等则直接判定,如果相等,则进入第二步2》重写isEqual方法
(4)在项目中的具体使用:重写hash方法
- (NSUInteger)hash { return [self.name hash] ^ [self.birthday hash]; // NSObject的hash值是调用hash方法的对象地址,一般不用,需要重写一个hash的方法实现 //return [super hash]; }
PS :参考
阅读全文
0 0
- iOS之《Effective Objective-C 2.0》读书笔记(8)
- <iOS读书笔记>之Effective Objective-C 2.0
- iOS之《Effective Objective-C 2.0》读书笔记(1)
- iOS之《Effective Objective-C 2.0》读书笔记(2)
- iOS之《Effective Objective-C 2.0》读书笔记(3)
- iOS之《Effective Objective-C 2.0》读书笔记(4)
- iOS之《Effective Objective-C 2.0》读书笔记(5)
- iOS之《Effective Objective-C 2.0》读书笔记(6)
- iOS之《Effective Objective-C 2.0》读书笔记(7)
- iOS之《Effective Objective-C 2.0》读书笔记(9)
- iOS之《Effective Objective-C 2.0》读书笔记(10)
- iOS之《Effective Objective-C 2.0》读书笔记(11)
- iOS之《Effective Objective-C 2.0》读书笔记(12)
- iOS之《Effective Objective-C 2.0》读书笔记(13)
- iOS之《Effective Objective-C 2.0》读书笔记(14)
- iOS之《Effective Objective-C 2.0》读书笔记(16)
- iOS之《Effective Objective-C 2.0》读书笔记(17)
- iOS之《Effective Objective-C 2.0》读书笔记(21)
- 寻找旋转排序数组中的最小值
- 使用mysqlreplicate命令快速搭建 Mysql 主从复制
- MySQL5.6X 主从配置
- [bzoj4503]&[caioj1455][FFT]串
- Codeforces Round #428 (Div. 2) E
- iOS之《Effective Objective-C 2.0》读书笔记(8)
- Django+Karlooper+ios重构学校的学生成绩管理系统(二)学生信息管理系统
- 树莓派如何挂载硬盘/U盘
- 'module' object has no attribute 'OP_NO_TLSv1_1'问题解决
- 总结unicode和utf-8的区别
- Android SurfaceView 播放视频
- Mybatis之分页插件——PageHelper
- Socket通讯简介
- Yii框架无法设置Content-Type之谜