美文网首页
iOS开发 论两个OC对象相等

iOS开发 论两个OC对象相等

作者: 没穿秋裤 | 来源:发表于2018-08-27 12:13 被阅读0次

之前去陌陌面试 ,出了一道面试题,说是判断两个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

NSDictionary里面元素也是无序的,key不能重复,所以字典对key的查找也是通过散列算法。

学的时候,只是想着会用就行,慢慢发现,这些基础的类的实现原理还是很值得我们去考究的。。。

相关文章

网友评论

      本文标题:iOS开发 论两个OC对象相等

      本文链接:https://www.haomeiwen.com/subject/zrytiftx.html