NSDictionary實現原理

2021-07-05 06:33:05 字數 2303 閱讀 7574

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 表中的位置。

下面,我根據乙個小demo來自定義乙個作為 nsdictionary 的 key 值的類。見**:

keyobject.h檔案:

//

// keyobject.h

// keydemo

//// created by linshaolie on 14-11-26.

//#import @inte***ce keyobject : nsobject//實現copying協議

//作為hash值

@property(nonatomic, readonly) nsuinteger hashvalue;

- (instancetype)initwithhashi:(nsuinteger)i;

@end

keyobject.m檔案:

//

// keyobject.m

// keydemo

//// created by linshaolie on 14-11-26.

//#import "keyobject.h"

@inte***ce keyobject ()

//作為hash值

@property(nonatomic) nsuinteger hashvalue;

@end

@implementation keyobject

- (instancetype)initwithhashvalue:(nsuinteger)hashvalue

return self;

}#pragma mark -overload methor

- (bool)isequal:(id)object

- (nsuinteger)hash

#pragma mark -nscopying

- (id)copywithzone:(nszone *)zone

#pragma mark -private methor

//雜湊函式

- (nsuinteger)hashkeyvalue

@end

viewcontroller.m檔案:(測試)

//

// viewcontroller.m

// keydemo

//// created by lin on 14-11-26.

//#import "viewcontroller.h"

#import "keyobject.h"

@inte***ce viewcontroller ()

@end

@implementation viewcontroller

- (void)viewdidload

@end

NSDictionary底層實現原理

那麼問題來了什麼是hash表呢?雜湊表 hash表 又叫做雜湊表,是根據關鍵碼值 key value 而直接訪問的 資料結構 也就是說它通過關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映叫做 函式 存放記錄的 陣列 叫做 雜湊表 讀到此處我們得到乙個關鍵資訊 所謂 雜湊表就是乙個陣...

NSDictionary底層實現原理

一言以蔽之 在oc中nsdictionary是使用hash表來實現key和value的對映和儲存的。那麼問題來了什麼是hash表呢?雜湊表 hash表 又叫做雜湊表,是根據關鍵碼值 key value 而直接訪問的 資料結構 也就是說它通過關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個...

簡單常用 NSDictionary

新增我們的測試 nsdictionary dictionary nsdictionary dictionarywithobjectsandkeys lucy name 15810463139 number nil 得到詞典的數量 nsinteger mcount dictionary count n...