常用的比較方法有NSString、NSArray和ns dictionary’的比較方法;它們不是比較指針,而是指針以外的比較對象。
以isEqualToArray為例
結果:
它表明array1和array2是兩個不同的對象(不同的指針),但它們是兩個相同的對象。
在NSObject協議中有兩種判斷等價性的方法:
NSObject類對這兩個方法的默認實現是,當且僅當這兩個對象的“指針值”完全相等時,它們才相等。
這將導致壹個問題:如果我們希望在壹個NSSet中沒有等價對象,並且默認的isEqual和hash方法只會根據指針進行判斷,那麽我們仍然會將具有不同指針的等價對象放入該集合中。顯然,這無法達到預期的效果。所以現在我們必須重寫這兩個方法。
同時重寫isEqual:方法。
什麽是哈希碼?
哈希代碼不是完全唯壹的。它是壹種算法,允許同壹類的對象根據其不同的特征具有不同的哈希代碼,但並不意味著不同對象的哈希代碼完全不同。事實也是如此,這取決於程序員如何編寫哈希代碼算法。
根據平等協議:
如果兩個對象相等,則起始哈希代碼也相等,但具有相同哈希的兩個對象不壹定相等。
因此,相等的對象必須有相等的哈希碼,不同對象的哈希碼盡量不要重復;
我們可以根據對象的屬性值生成壹個哈希碼;但是,生成的哈希代碼仍可能是重復的,但不會產生太大影響。
我們知道isEqual: method或isEqualToPeople: method會被程序員主動調用來判斷對象是否等價,但hash方法沒有isEqual方法那麽強大。
這個問題可以解釋如下:
當需要調用對象的哈希代碼作為或生成標識碼來標識不同的對象時。
正如我們所知,字典根據鍵來查找值,因此字典中不能有相同的鍵。
1.當對象用作字典的鍵值時,將調用hash方法,幫助對象被稱為字典中的唯壹鍵。
註意實現對象的copyWithZone方法。
2.NSSet中不允許重復的對象,因此在向NSMutableSet添加對象時,將調用該對象的hash方法來比較該對象是否已經存在於集合中。
需要註意的是,在向集合中添加可變對象後,盡量不要更改其哈希代碼。
原因:
我們在上面定義了散列方法的實現。哈希代碼是根據人物對象的名稱和年齡設置的,因此p3和p4可以添加到集合set4中。
現在,讓我們更改p4,使p4和p3的哈希代碼相同,看看將發送什麽。
在這壹點上,p3和p4是等效的。
我們可以看到集合中實際上有兩個相同的對象,其中不能存在重復的對象!
那麽我們如何去掉這兩個等價物體中的壹個呢?
結果:
通過復制方法,壹個全新的集合被深度復制,就像將對象逐個添加到新集合中壹樣。這個問題還是要根據開發商目前的需求來決定是否需要復盤。