Objective-C 运行时的改进之数据结构的变化

WWDC2020介绍Objective-C 运行时的改进,主要介绍了三个变化:

1.Class data structures changes;

首先是数据结构的变化,Objective-C 运行时会使用他们来追踪类。

2.Relative method lists;

Objective-C方法列表的变化

3.tagged pointer 格式的变化;

本文先对Class data structures changes展开讲解:
在磁盘上,在你的app二进制文件中 类时这样的:

Superclass.png

首先这个类对象本身,包含了最常被访问的信息指向
元类(Metaclass)超类(Superclass)方法缓存的指针(Method cache)
它还有一个指向更多数据的指针,存储额外信息的地方叫做class_ro_t, ro代表只读,它包括像类名称,方法、协议和实例变量的信息。
class_ro_t.png

Swift 类和Objective-C类共享这一基础结构,所以每个Swift类也有这些数据结构,当类第一次从磁盘加载到内存中时,他们一开始也是这样的,但是一经使用,他们就会发生变化。
这里先区分下:clean memorydirty memory

clean memory:是指加载后不会发生更改的内存。class_ro_t 就属于clean memory因为它是属于只读的。

dirty memory:是指在进程运行时会发生更改的内存。
类结构一经使用就会变成dirty memory,因为运行时会向它写入新的数据。
例如:创建一个新的方法缓存并从类中指向它,dirty memoryclean memory要昂贵得多,只要进程在运行,它就一直存在。
另一方面clean memory 可以进行移除从而节省更多的内存空间,因为如果你需要clean memory系统可以从磁盘中重新加载,MacOS 可以选择换出dirty memory,但是因为iOS不使用swap,所以dirty memory在iOS中代价很大,dirty memory是这个类数据被分成两部分的原因,可以保持清洁的数据越多越好,通过分离那些永远不会更改的数据,可以把大部分的类数据存储为clean memory

这些数据足以让我们开始,但是运行时需要追踪每个类的更多信息,所以当一个类首次被使用,运行时会为它分配额外的存储容量,这个运行时分配的存储容量是class_rw_t 用于读取-编写数据,在这个数据结构中,我们存储了只有在运行时才会生成的新信息。

class_rw_t.png

例如:所有的类都会链接成一个树状结构,这是通过使用First SubclassNext sibling Class 指针实现的,这运行时遍历当前使用的所有类,对于使方法缓存无效非常有用。

class_rw_t.png

但为什么方法和属性也在只读数据中时这里还有方法和属性呢?
因为它们可以在运行时进行更改
category被加载时它可以向类中添加新的方法,而且开发者可以使用运行时API动态地添加他们,因为class_ro_t是只读的,所以我们需要在class_rw_t中追踪这些东西。

class_rw_t.png

现在这样做会占用相当多的内存,在任何给定的设备中都有许多类在使用。我们在iPhone上的整个系统中测量了,大约30兆字节这些class_rw_t结构,那么如何缩小这些数据结构呢?

在读取-编写部分需要这些东西,因为他们可以喜爱运行时进行更改,但是通过检查实际设备上的使用情况,我们发现大约只有10%的类真正地更改了他们的方法,只有Swift类会使用这个demangled name字段,但是Swift类并不需要这一字段,除非有东西询问它们的 Objective-C名称时才需要
class_rw_t.png

所以,我们可以拆掉那些平时不用的部分,这将class_rw_t的大小减少了一半
class_rw_t.png

对于确实需要额外信息的类,我们可以分配这些扩展记录中的一个,并把它滑到类中供其使用。


class_rw_t.png

大约90%的类从不需要这些扩展数据,这在系统范围内可以节约大约14MB的内存,这些内存现在可以用于更有效的用途,比如存储你的APP的数据,因此 实际上你可以在你的Mac上看到这一变化带来的影响,这只需要在终端机上运行一些简单的命令,现在一起来看一下。
在此进入Macbook的终端,要运行一个命令它在任何Mac上都可用叫做heap,它还允许你检查正在运行的进程所使用的堆内存,将在Mac中的Mail app上运行它 ,现在 如果我运行该命令,他会输出千行,显示通过邮件进行的每个堆分配,所以 我只是要 grep 它为 我们今天一直在谈论的类型 class_rw_t类型 我还需要查询标头 从返回的结果中,

heap Mail.png

可以看到 在邮件app中使用了大约9000个这样的class_rw_t类型,但是其中大约十分之一 900 多一点实际上需要使用这一扩展信息,所以可以很容易地计算出通过这个改变所有节省的内存,这是大小减半的类型,所以如果我们从这个数字中减去,必须分配给扩展类型的内存量,可以看到节省了大约1兆字节数据的四分之一。

如果在系统范围内进行扩展,对dirty memory而言 这是真正的节省内存。

现在很多从类获取数据的代码,必须同时处理那些有扩展数据和没有扩展数据的类,运行时会为你处理这一切,并且从外部看 一切都像往常一样工作,只是使用了更少内存,之所以会这样,是因为读取这些结构的代码,都在运行时内并且还会同时进行更新.
class_rw_t.png

坚持使用这些API真的很重要
因为试图直接访问这些数据的结构的代码,都将在今年的OS版本中停止工作,旧东西已经发生了变化,而且该代码不知道新的布局,看到一些真实的代码由于这些变化而崩溃,除了你自己的代码之外,还要注意哪些外部依赖性,可能正把他们带入到你的APP中,他们可能会在你没有意识的情况下挖掘这些数据结构,

class_rw_t.png

这些结构中的所有信息都可以通过官方API获取,有一些函数 如class_getName和class_getSuperclass当你使用这些API访问信息时,你知道 无论我们在后台进行什么更改,他们都将继续工作,所有的API都可以在Objective-C运行时说明文档中找到。

以上就是WWDC2020介绍Objective-C 运行时的改进之数据结构的变化的一些记录,希望对大家的学习有所帮助。

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

推荐阅读更多精彩内容