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...