iOS开发之runtime(23):maptable之入门

logo

本系列博客是本人的源码阅读笔记,如果有 iOS 开发者在看 runtime 的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(iOS技术讨论群),想要加入的,请添加本人微信:zhujinhui207407,【加我前请备注:ios 】,本人博客http://www.kyson.cn 也在不停的更新中,欢迎一起讨论

本文完整版详见笔者小专栏:https://xiaozhuanlan.com/runtime

背景

今天我们开始讲解 runtime 中一个非常重要的数据结构: maptable,它是 runtime 中存储各类数据的重要的类,这些数据包含但不限于 runtime 中所有的类,所有的协议等。为了方便大家阅读 maptable 的源码,笔者将这个文件剥离出原项目,并放到 GitHub 中供大家研究:
https://github.com/zjh171/RuntimeSample

全局搜索maptable看到70多个结果


NXMapTable搜索结果

除掉maptable也有20多个引用。可见了解maptableruntime有比较重要的作用。为了方便后面笔者对代码分析,这里对maptable.h以及maptable.mm做个介绍。

进入maptable.h发现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外还有一个结构体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.

意思是,该模块通过键值对提供了对象之间的散列关系,其中,键和值必须是指针或者是整数。用户需要负责对象的创建以及释放,该对象提供了释放的回调函数而这三个结构体应该就是这个对象的实体相关的信息。

分析

在讲解这三个结构体之前,笔者先讲一些C的基础知识。我们注意到文件maptable.h中大部分方法前都加了OBJC_EXPORT修饰符,方法后也加了修饰符。为了理解修饰符的作用,我们可以先全局搜索一下相关的修饰符。

OBJC_EXPORT

继续往下查看发现后面的方法都是以OBJC_EXPORT开头,以OBJC_MAP_AVAILABILITY结尾,那么这两个宏的作用是什么呢?笔者全局搜索了一下,看到了其定义:

#if !defined(OBJC_EXPORT)
#   define OBJC_EXPORT  OBJC_EXTERN OBJC_VISIBLE
#endif

OBJC_EXPORT应该未被定义是显而易见的,因为如果被定义的话,

#   define OBJC_EXPORT  OBJC_EXTERN OBJC_VISIBLE

就不被执行,肯定会报错。因此我们只需要分析OBJC_EXTERNOBJC_VISIBLE宏定义,笔者继续分析这两个宏。接下来一一分析:

本文详细版请见:
iOS开发之runtime(23):maptable介绍(一)

广告

我的首款个人开发的APP壁纸宝贝上线了,欢迎大家下载。

壁纸宝贝

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容