NSDictionary(字典)是使用 hash表來實(shí)現(xiàn)key和value之間的映射和存儲(chǔ)的祝拯, hash函數(shù)設(shè)計(jì)的好壞影響著數(shù)據(jù)的查找訪問效率。數(shù)據(jù)在hash表中分布的越均勻,其訪問效率越高趣斤。而在Objective-C中讨衣,通常都是利用NSString 來作為鍵值,其內(nèi)部使用的hash函數(shù)也是通過使用 NSString對(duì)象作為鍵值來保證數(shù)據(jù)的各個(gè)節(jié)點(diǎn)在hash表中均勻分布没炒。
? ? ?見NSDictionary中最常用的一個(gè)方法原型:
- (void)setObject:(id)anObject forKey:(id )aKey;
? ? ?從這個(gè)方法中可以知道涛癌, 要作為 Key 值,必須遵循 NSCopying 協(xié)議。也就是說在NSDictionary內(nèi)部拳话,會(huì)對(duì) aKey 對(duì)象 copy 一份新的先匪。而 ?anObject 對(duì)象在其內(nèi)部是作為強(qiáng)引用(retain或strong)。所以在MRC下弃衍,向該方法發(fā)送消息之后呀非,我們會(huì)向anObject發(fā)送 release 消息進(jìn)行釋放。
? ? ?既然知道了作為 key 值镜盯,必須遵循 NSCopying 協(xié)議岸裙,說明除了 NSString 對(duì)象之外,我們還可以使用其他類型對(duì)象來作為 NSDictionary 的 key值速缆。不過這還不夠降允,作為 key 值,該類型還必須繼承于 NSObject 并且要重載一下兩個(gè)方法:
- (NSUInteger)hash;
? ? ?- (BOOL)isEqual:(id)object;
? ? ?其中艺糜,hash 方法是用來計(jì)算該對(duì)象的 hash 值剧董,最終的 hash 值決定了該對(duì)象在 hash 表中存儲(chǔ)的位置。所以同樣破停,如果想重寫該方法翅楼,我們盡量設(shè)計(jì)一個(gè)能讓數(shù)據(jù)分布均勻的 hash 函數(shù)。
isEqual 方法是為了通過 hash 值來找到 對(duì)象 在hash 表中的位置辱挥。