數(shù)組
普通C數(shù)組
采用連續(xù)的內(nèi)存存儲,插入和刪除操作會帶來大量的內(nèi)存移動操作。
- 在下標(biāo)0處插入一個元素

- 移除第一個元素

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


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

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ù)。
參考文章
集合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、didChangeValueForKeyswift的kvo:
繼承自NSObject的類,或者直接willset/didset實現(xiàn)。
對象、類、isa指針原理
OC是一門面向?qū)ο蟮恼Z言,每一個對象都是類的一個實例。在objective-c語言的內(nèi)部,每一個對象都有一個isa指針,指向該指針的類。每一個類描述了一系例他的實例的特點,包括成員變量的列表,成員函數(shù)的列表。每一個對象都可以接收消息,而對象接收消息列表保存在他所對應(yīng)的類中。
