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

isEqual 和、isEqualToString 和==

首先 OC中的對象都是用指針表示,方法的調用是基於消息機制實現,== 比較的天然是指針指向的地址 spa

而後 說下 isEqual 和 isEqualToString 的區別 指針

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

所以從繼承關係角度來講isEqualToString 是 isEqual 的衍生方法 繼承

首先貼個蘋果官方重寫isEqual 的demo get

  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. }

簡單說一下: hash

首先都會判斷 指針是否相等 ,相等直接返回YES, class

不相等再判斷是不是同類對象或非空,空或非同類對象直接返回NO, 方法

然後依次判斷對象對應的屬性是否相等,若均相等,返回YES 協議

這樣就不難理解 isEqualToString 的實現內部的了 demo

最後解釋 HashCode 和 isEqual 的關係

hash和isEqual:方法都在NSObject協議中聲明,且彼此關係緊密。實現hash方法必須返回一個整型數(NSInterger),做爲哈希表結構中的表地址。

兩個對象相等(isEqual:方法的判斷結果)意味着它們有相同的哈希值。若是哈希值相同,兩個對象不必定相等。

若是您的對象可能被包含在象NSSet這樣的集合中,則須要定義hash方法,好比UIWebView

並確保該方法在兩個對象相等的時候返回相同的哈希值
相關文章
相關標籤/搜索