NSMutableDictionary實現原理分析

不積跬步無以至千里。 ——送給第一篇博客

問題

NSMutableDictionary是怎么實現的?

解決方案

學習實現原理最好的辦法就是查看源代碼,這部分代碼也很容易找到

/****************   Mutable Dictionary  ****************/

@interface NSMutableDictionary<KeyType, ObjectType> : NSDictionary<KeyType, ObjectType>

- (void)removeObjectForKey:(KeyType)aKey;
- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;
- (instancetype)init NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCapacity:(NSUInteger)numItems NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;

@end

@interface NSMutableDictionary<KeyType, ObjectType> (NSExtendedMutableDictionary)

- (void)addEntriesFromDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;
- (void)removeAllObjects;
- (void)removeObjectsForKeys:(NSArray<KeyType> *)keyArray;
- (void)setDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;
- (void)setObject:(nullable ObjectType)obj forKeyedSubscript:(KeyType <NSCopying>)key NS_AVAILABLE(10_8, 6_0);

@end

從源代碼中我們可以看到NSMutableDictionary是繼承自NSDictionary的,但是添加了增加刪除等方法常潮。將NSDictionary變成可變的字典類型。我們再打開NSDictionary的實現代碼看一下楷力。

@interface NSDictionary<KeyType, ObjectType> (NSExtendedDictionary)

@property (readonly, copy) NSArray<KeyType> *allKeys;//key數組
- (NSArray<KeyType> *)allKeysForObject:(ObjectType)anObject;
@property (readonly, copy) NSArray<ObjectType> *allValues;//value數組
@property (readonly, copy) NSString *description;

我們可以看到NSDictionary中包含了兩個NSArray,及一個對應Key的NSArray和一個對應Value的NSArray孵户。
從以上兩端代碼中我們可以看到NSDictionary以及NSArray的屬性均為(readonly,copy)類型的萧朝,顧名思義其值是只讀的,不可改變夏哭。這也符合了介紹检柬,但是NSMutableDictionary以及NSMutableArray均繼承于屬性不可變的父類,那他是怎么實現可變的呢?由于SDK只開放了.h文件(其實就是只告訴了我們API)何址,沒有開放.m文件里逆,我們無法獲得其實現細節(jié)。我的猜測是把內容拷貝出來重新賦值給新的對象用爪,在替換原地址原押,但是感覺好蠢。以后有能力可以細究一下偎血。

意外發(fā)現

看源代碼的時候發(fā)現NSArray中集成二分查找诸衔,但二分查找一般針對排序數組會有比較快的效率。百度了一下颇玷,發(fā)現一篇文章 ,這篇文章對iOS的各種集合類做了一定的分析笨农。其中也提到了一開始對apple這種將很多集合分為可變和不可變的感覺很怪異,不過這樣做可以使得其線程安全帖渠,這樣其付出的代價也是值得的谒亦,有興趣可以拜讀一下。

typedef NS_OPTIONS(NSUInteger, NSBinarySearchingOptions) {
    NSBinarySearchingFirstEqual = (1UL << 8),
    NSBinarySearchingLastEqual = (1UL << 9),
    NSBinarySearchingInsertionIndex = (1UL << 10),
};

- (NSUInteger)indexOfObject:(ObjectType)obj inSortedRange:(NSRange)r options:(NSBinarySearchingOptions)opts usingComparator:(NSComparator)cmp NS_AVAILABLE(10_6, 4_0); // binary search
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末空郊,一起剝皮案震驚了整個濱河市份招,隨后出現的幾起案子,更是在濱河造成了極大的恐慌渣淳,老刑警劉巖脾还,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異入愧,居然都是意外死亡鄙漏,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門棺蛛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怔蚌,“玉大人,你說我怎么就攤上這事旁赊¤胗唬” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵终畅,是天一觀的道長籍胯。 經常有香客問我,道長离福,這世上最難降的妖魔是什么杖狼? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮妖爷,結果婚禮上蝶涩,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好绿聘,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布嗽上。 她就那樣靜靜地躺著,像睡著了一般熄攘。 火紅的嫁衣襯著肌膚如雪兽愤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天鲜屏,我揣著相機與錄音烹看,去河邊找鬼。 笑死洛史,一個胖子當著我的面吹牛惯殊,可吹牛的內容都是我干的。 我是一名探鬼主播也殖,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼土思,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忆嗜?” 一聲冷哼從身側響起己儒,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捆毫,沒想到半個月后闪湾,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡绩卤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年途样,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片濒憋。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡何暇,死狀恐怖,靈堂內的尸體忽然破棺而出凛驮,到底是詐尸還是另有隱情裆站,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布黔夭,位于F島的核電站宏胯,受9級特大地震影響,放射性物質發(fā)生泄漏本姥。R本人自食惡果不足惜胳嘲,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扣草。 院中可真熱鬧,春花似錦、人聲如沸辰妙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽密浑。三九已至蛙婴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尔破,已是汗流浹背街图。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留懒构,地道東北人餐济。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像胆剧,于是被迫代替她去往敵國和親絮姆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容