NSDictionary(字典)是使用 hash表來實現key和value之間的映射和存儲的, hash函數設計的好壞影響著數據的查找訪問效率。數據在hash表中分布的越均勻,其訪問效率越高。而在Objective-C中,通常都是利用NSString 來作為鍵值,其內部使用的hash函數也是通過使用 NSString對象作為鍵值來保證數據的各個節點在hash表中均勻分布。
? ? ?見NSDictionary中最常用的一個方法原型:
- (void)setObject:(id)anObject forKey:(id )aKey;
? ? ?從這個方法中可以知道, 要作為 Key 值,必須遵循 NSCopying 協議。也就是說在NSDictionary內部,會對 aKey 對象 copy 一份新的。而 ?anObject 對象在其內部是作為強引用(retain或strong)。所以在MRC下,向該方法發送消息之后,我們會向anObject發送 release 消息進行釋放。
? ? ?既然知道了作為 key 值,必須遵循 NSCopying 協議,說明除了 NSString 對象之外,我們還可以使用其他類型對象來作為 NSDictionary 的 key值。不過這還不夠,作為 key 值,該類型還必須繼承于 NSObject 并且要重載一下兩個方法:
- (NSUInteger)hash;
? ? ?- (BOOL)isEqual:(id)object;
? ? ?其中,hash 方法是用來計算該對象的 hash 值,最終的 hash 值決定了該對象在 hash 表中存儲的位置。所以同樣,如果想重寫該方法,我們盡量設計一個能讓數據分布均勻的 hash 函數。
isEqual 方法是為了通過 hash 值來找到 對象 在hash 表中的位置。