iOS數(shù)組和字典原理-2021-02-05-周五

數(shù)組

普通C數(shù)組

采用連續(xù)的內(nèi)存存儲,插入和刪除操作會帶來大量的內(nèi)存移動操作。

  • 在下標(biāo)0處插入一個元素
image.png
  • 移除第一個元素
image.png

_NSArrayM

用了環(huán)形緩沖區(qū)(circular buffer),在插入和刪除的時候, 只會移動最少的一邊元素.

移動左邊
移動右邊

參考文章

iOS總結(jié)-NSArray的底層實現(xiàn)

字典

NSDictionary(字典)是使用hash表來實現(xiàn)key和value之間的映射和存儲的

image.png

key和value分別存成數(shù)組,查詢性能高;

哈希原理

散列表(Hash table,也叫哈希表),是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過把關(guān)鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做散列表。

給定表M,存在函數(shù)f(key),對任意給定的關(guān)鍵字值key,代入函數(shù)后若能得到包含該關(guān)鍵字的記錄在表中的地址,則稱表M為哈希(Hash)表,函數(shù)f(key)為哈希(Hash) 函數(shù)。

哈希概念:哈希表的本質(zhì)是一個數(shù)組,數(shù)組中每一個元素稱為一個箱子(bin),箱子中存放的是鍵值對。

hash表其實也是一個數(shù)組,區(qū)別數(shù)組的地方是它會建立 存儲的值 到 存儲的下標(biāo) 索引的一個映射,也就是散列函數(shù)。

參考文章

iOS底層原理:NSDictionary原理

集合NSSet

和字典類似,也是采用hash表的方式,只有keys數(shù)組,沒有values數(shù)組

struct __CFDictionary {
    CFRuntimeBase _base;
    CFIndex _count;     /* number of values */
    CFIndex _capacity;      /* maximum number of values */
    CFIndex _bucketsNum;    /* number of slots */
    uintptr_t _marker;
    void *_context;     /* private */
    CFIndex _deletes;
    CFOptionFlags _xflags;      /* bits for GC */
    const void **_keys;     /* can be NULL if not allocated yet */
    const void **_values;   /* can be NULL if not allocated yet */
};

weak指針

runtime對注冊的類,會進(jìn)行布局,會將 weak 對象放入一個 hash 表中。用 weak 指向的對象內(nèi)存地址作為 key,

當(dāng)此對象的引用計數(shù)為0的時候會調(diào)用對象的 dealloc 方法,假設(shè) weak 指向的對象內(nèi)存地址是a,那么就會以a為key,

在這個 weak hash表中搜索,找到所有以a為key的 weak 對象,從而設(shè)置為 nil。

KVO底層實現(xiàn)原理

  • KVO原理:
    當(dāng)觀察一個對象時,runtime會動態(tài)創(chuàng)建繼承自該對象的類,并重寫被觀察對象的setter方法,重寫的setter方法會負(fù)責(zé)在調(diào)用原setter方法前后通知所有觀察對象值得更改,最后會把該對象的isa指針指向這個創(chuàng)建的子類,對象就變成子類的實例。

  • 如何手動觸發(fā)KVO:
    在setter方法里,手動實現(xiàn)NSObject兩個方法:willChangeValueForKey、didChangeValueForKey

  • swift的kvo:
    繼承自NSObject的類,或者直接willset/didset實現(xiàn)。

對象、類、isa指針原理

OC是一門面向?qū)ο蟮恼Z言,每一個對象都是類的一個實例。在objective-c語言的內(nèi)部,每一個對象都有一個isa指針,指向該指針的類。每一個類描述了一系例他的實例的特點,包括成員變量的列表,成員函數(shù)的列表。每一個對象都可以接收消息,而對象接收消息列表保存在他所對應(yīng)的類中。

image.png

ios中isa指針

iOS runtime 之 isa指針

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容