Obj-C中的isEqual 和、isEqualToString 和==

isEqual 和、isEqualToString 和==

首先 OC中的对象都是用指针表示,方法的调用是基于消息机制实现,== 比较的自然是指针指向的地址

然后 说下 isEqual 和 isEqualToString 的区别

IsEqual 是 NSObject 的方法 ,而 isEqualToString 是 NSString 的方法

因此从继承关系角度来说isEqualToString 是 isEqual 的衍生方法

首先贴个苹果官方重写isEqual 的demo

  1. - (BOOL)isEqual:(id)other {  
  2.  if (other == self)   
  3.  return YES;  
  4.  if (!other || ![other isKindOfClass:[self class]])  
  5.  return NO;  
  6.  return [self isEqualToWidget:other];  
  7. }  
  8.  
  9. - (BOOL)isEqualToWidget:(MyWidget *)aWidget {  
  10.  if (self == aWidget)  
  11.  return YES;  
  12.  if (![(id)[self name] isEqual:[aWidget name]])  
  13.  return NO;  
  14.  if (![[self data] isEqualToData:[aWidget data]])  
  15.  return NO;  
  16.  return YES;  
  17. }

简单说一下:

首先都会判断 指针是否相等 ,相等直接返回YES,

不相等再判断是否是同类对象或非空,空或非同类对象直接返回NO,

而后依次判断对象对应的属性是否相等,若均相等,返回YES

这样就不难理解 isEqualToString 的实现内部的了

最后解释 HashCode 和 isEqual 的关系

hash和isEqual:方法都在NSObject协议中声明,且彼此关系紧密。实现hash方法必须返回一个整型数(NSInterger),作为哈希表结构中的表地址。

两个对象相等(isEqual:方法的判断结果)意味着它们有相同的哈希值。如果哈希值相同,两个对象不一定相等。

如果您的对象可能被包含在象NSSet这样的集合中,则需要定义hash方法,比如UIWebView

并确保该方法在两个对象相等的时候返回相同的哈希值

你可能感兴趣的:(Obj-C中的isEqual 和、isEqualToString 和==)