之前去陌陌面试 ,出了一道面试题,说是判断两个OC对象相等,回来就好好研究了一下。。。。。。
- 在OC里面
对于基本数据类型,==运算符比较的是值;
对于对象类型,==运算符比较的是对象的地址;
面试官给的答案就是 "==",处处是坑....
当然啦的,咱们肯定得在深入研究研究啦的,cocoaFramework定义的类型都具有-isEqual方法和-hash方法,
- 系统提供的类,NSString、NSArray、NSDictionary等系统已经实现了-isEquel和-hash方法;
- 自定义的类,需要自己实现-isEquel和-hash方法,还可以模仿系统的特定方法,-isEquelMyCalss;
系统的封装的equal方法 调用的话 用这个方法比调用isEqual方法效率更高
NSAttributedString -isEqualToAttributedString:
NSData -isEqualToData:
NSDate -isEqualToDate:
NSDictionary -isEqualToDictionary:
NSHashTable -isEqualToHashTable:
NSIndexSet -isEqualToIndexSet:
NSNumber -isEqualToNumber:
NSOrderedSet -isEqualToOrderedSet:
NSSet -isEqualToSet:
NSString -isEqualToString:
NSTimeZone -isEqualToTimeZone:
NSValue -isEqualToValue:
实现判断两个自定义对象相等的例子---重写这三个方法
- (BOOL)isEqualToMyCalss:(MyCalss *)object {
//判断 如果两个内存地址都相等的话,直接就返回相等
if (self == object) {
return YES;
}
//判断 如果对象的属性值不同
if (![_prop1 isEqualToString: object. prop1]) {
return NO;
}
if (![_prop1 isEqualToString: object. prop1]) {
return NO;
}
return YES;
}
- (BOOL)isEqual:(id)object {
if ([self class] == [object class]) {
return [self isEqualToMyCalss:(MyCalss *)object];
} else {
return [super isEqual:object];
}
}
- (NSUInteger)hash {
NSUInteger prop1Hash = [_prop1 hash];
NSUInteger prop2Hash = [_prop2 hash];
return prop1Hash ^ prop2Hash;
}
- 接下来要谈谈
iOS中,NSSet(集合)和NSDictionary(字典)两个系统类,
NSSet是无序的集合,集合是一种哈希表,运用散列算法,查找集合中的元素比数组速度更快,但是它没有顺序。
- 注:集合里面放系统的对象没遇见啥问题,但是放自定义的对象会出错,自定义对象必须实现"-hash"和"-isEqual",参考文档可以见https://www.jianshu.com/p/6a4107a2951b。
网友评论