Effective-Objc 52 tips

1.判斷對象是否相等的tip

  1. isEqual or ==
NSString *foo = @"Badger 123";
NSString *bar = [NSString stringWithFormat:@"Badger %i", 123]; 
BOOL equalA = (foo == bar); //< equalA = NO
BOOL equalB = [foo isEqual:bar]; //< equalB = YES
BOOL equalC = [foo isEqualToString:bar]; //< equalC = YES

isEqual方法來自于NSObject協(xié)議,有時等號不能解決的問題,可以通過重寫isEqual方法來自定義實現(xiàn)。
其內(nèi)部原理在于可以通過計算每一個object的hash值來判斷兩個object是否相等。

- (NSUInteger)hash;

而hash的計算是一件耗時工作,因此如果可以不需要計算hash,而是通過計算每個對象的identifier值則也可以達到目的。
當然需要在定義class時,并添加identifier屬性,和比較方法

@property NSUInteger identifier;

2)相等性判斷在集合中使用中的作用
已知集合是不允許有重復元素的,但有時當我們在集合中添加可變數(shù)組,卻可以出現(xiàn)集合中含有的元素一樣的情況,參考以下代碼:

NSMutableSet *set = [NSMutableSet new];
NSMutableArray *arrayA = [@[@1, @2] mutableCopy]; 
[set addObject:arrayA];

NSLog(@"set = %@", set); 
// Output: set = {((1,2))}
NSMutableArray *arrayB = [@[@1, @2] mutableCopy]; 
[set addObject:arrayB];

NSLog(@"set = %@", set);
// Output: set = {((1,2))}

可以看到上面這種方式添加集合中的元素不會實現(xiàn)出現(xiàn)集合中元素有一致的情況

但如果這樣操作就可以了!

NSMutableArray *arrayC = [@[@1] mutableCopy];
[set addObject:arrayC];

NSLog(@"set = %@", set);
// Output: set = {((1),(1,2))}

 [arrayC addObject:@2]; 
 NSLog(@"set = %@", set);
// Output: set = {((1,2),(1,2))}

這樣就實現(xiàn)了集合set中存有兩個一樣的元素了。當然這個問題是為了引發(fā)別的思考,既然我們可以實現(xiàn)集合中存在一樣的元素,但是不能保證集合在拷貝后一樣維持原來,當然也不可能維持原來,這就是我們在做集合內(nèi)相等比較判斷時需要注意的問題!

1. 如果想比較兩個object是否相等,請實現(xiàn)isEqual:和hash兩種方法

2. 兩個對象相等,一定含有同樣的hash值;但是含有同樣哈希值的兩個對象卻不一定相等

3. 巧妙地設(shè)計比較方法(比如identifier),比簡單直接比較所有屬性更有意義

4. 雖然為了實現(xiàn)絕對唯一性,hash方法可以設(shè)計的很復雜,但是出于性能考慮,適當?shù)亓粲衕ash沖突也是必要的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 對數(shù)據(jù)的等同性判斷包括對基本數(shù)據(jù)類型等同性的判斷和對象等同性的判斷。對基本數(shù)據(jù)類型等同性的判斷是非常簡單的,...
    VV木公子閱讀 1,791評論 0 8
  • Objc 相等性判斷 今天做任務時遇到一個問題,情況是這樣的:我新建一個類,然后創(chuàng)建一個這個類的對象,然后將這個類...
    凌巔閱讀 1,605評論 0 1
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,658評論 0 3
  • 10月24日,橙思: 從現(xiàn)在開始,一切都來得及。 今日學習: 又遇奇葩,情商訓練營和分身術(shù)訓練營的生動實踐課,一把...
    NicoleYing閱讀 153評論 0 0
  • 在我腳下流動的, 是一抺金色, 在我眼里燃燒的, 是一個深秋, 在我心中回蕩的, 是一聲鹿吼, 知道了,我終于知道...
    二馬行空閱讀 550評論 0 3

友情鏈接更多精彩內(nèi)容