當前位置:成語大全網 - 書法字典 - OC對象等價

OC對象等價

根據相等性比較對象是壹個非常有用的功能。我們經常使用= =運算符進行比較,但= =比較的是指針本身,而不是它所引用的對象。如果兩個對象具有不同的指針,但所有其他屬性都相同,則這兩個對象可以說是等價的。

常用的比較方法有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是等效的。

我們可以看到集合中實際上有兩個相同的對象,其中不能存在重復的對象!

那麽我們如何去掉這兩個等價物體中的壹個呢?

結果:

通過復制方法,壹個全新的集合被深度復制,就像將對象逐個添加到新集合中壹樣。這個問題還是要根據開發商目前的需求來決定是否需要復盤。