本系列博客是本人的源碼閱讀筆記,如果有 iOS 開發(fā)者在看 runtime 的,歡迎大家多多交流崔赌。為了方便討論,本人新建了一個微信群(iOS技術(shù)討論群)耸别,想要加入的健芭,請?zhí)砑颖救宋⑿牛簔hujinhui207407,【加我前請備注:ios 】秀姐,本人博客http://www.kyson.cn 也在不停的更新中慈迈,歡迎一起討論
本文完整版詳見筆者小專欄:https://xiaozhuanlan.com/runtime
背景
今天我們開始講解 runtime 中一個非常重要的數(shù)據(jù)結(jié)構(gòu): maptable,它是 runtime 中存儲各類數(shù)據(jù)的重要的類省有,這些數(shù)據(jù)包含但不限于 runtime 中所有的類痒留,所有的協(xié)議等。為了方便大家閱讀 maptable 的源碼锥咸,筆者將這個文件剝離出原項目狭瞎,并放到 GitHub 中供大家研究:
https://github.com/zjh171/RuntimeSample
全局搜索maptable看到70多個結(jié)果
除掉maptable
也有20多個引用〔瑁可見了解maptable
對runtime
有比較重要的作用熊锭。為了方便后面筆者對代碼分析,這里對maptable.h
以及maptable.mm
做個介紹。
進入maptable.h
發(fā)現(xiàn)NXMapTable的定義如下:
typedef struct _NXMapTable {
/* private data structure; may change */
const struct _NXMapTablePrototype *prototype;
unsigned count;
unsigned nbBucketsMinusOne;
void *buckets;
} NXMapTable
其中_NXMapTablePrototype
的定義如下:
typedef struct _NXMapTablePrototype {
unsigned (*hash)(NXMapTable *, const void *key);
int (*isEqual)(NXMapTable *, const void *key1, const void *key2);
void (*free)(NXMapTable *, void *key, void *value);
int style; /* reserved for future expansion; currently 0 */
} NXMapTablePrototype
除了NXMapTable
以及NXMapTablePrototype
外還有一個結(jié)構(gòu)體NXMapState
:
typedef struct {int index;} NXMapState;
該文件的文件頭的注釋如下:
This module allows hashing of arbitrary associations [key -> value]. Keys and values must be pointers or integers, and client is responsible for allocating/deallocating this data. A deallocation call-back is provided.
意思是碗殷,該模塊通過鍵值對提供了對象之間的散列關(guān)系精绎,其中,鍵和值必須是指針或者是整數(shù)锌妻。用戶需要負責對象的創(chuàng)建以及釋放代乃,該對象提供了釋放的回調(diào)函數(shù)而這三個結(jié)構(gòu)體應該就是這個對象的實體相關(guān)的信息。
分析
在講解這三個結(jié)構(gòu)體之前仿粹,筆者先講一些C的基礎知識搁吓。我們注意到文件maptable.h
中大部分方法前都加了OBJC_EXPORT
修飾符,方法后也加了修飾符吭历。為了理解修飾符的作用堕仔,我們可以先全局搜索一下相關(guān)的修飾符。
OBJC_EXPORT
繼續(xù)往下查看發(fā)現(xiàn)后面的方法都是以OBJC_EXPORT
開頭晌区,以OBJC_MAP_AVAILABILITY
結(jié)尾摩骨,那么這兩個宏的作用是什么呢?筆者全局搜索了一下朗若,看到了其定義:
#if !defined(OBJC_EXPORT)
# define OBJC_EXPORT OBJC_EXTERN OBJC_VISIBLE
#endif
OBJC_EXPORT
應該未被定義是顯而易見的恼五,因為如果被定義的話,
# define OBJC_EXPORT OBJC_EXTERN OBJC_VISIBLE
就不被執(zhí)行哭懈,肯定會報錯灾馒。因此我們只需要分析OBJC_EXTERN
和OBJC_VISIBLE
宏定義,筆者繼續(xù)分析這兩個宏银伟。接下來一一分析:
本文詳細版請見:
iOS開發(fā)之runtime(23):maptable介紹(一)
廣告
我的首款個人開發(fā)的APP壁紙寶貝上線了你虹,歡迎大家下載。