• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

objective-c non-fragile ivars 学习笔记

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

    最近想要对我维护的 App 做启动优化,找到了这两个视频资料,Optimizing App Startup TimeiOS App Performance: Responsiveness。视频干货很多,涉及到了 iOS 可执行文件的结构、系统是如何启动 App 的等等底层知识,需要慢慢消化。针对其中的一个点,non-fragile ivars offset update ,这个启动流程中的一环,我继续搜索了一些资料,希望可以真的理解这个事情。我将从这个特性是为了解决什么问题、这个特性是如何解决问题的,原理是什么、这个特性有哪些应用等方面做一下总结。还参考了:http://quotation.github.io/objc/2015/05/21/objc-runtime-ivar-access.html

一、non-fragile ivars 解决了什么问题

    解决了二进制的兼容性问题。没有 non-fragile ivars 特性,SuperClass 增删了成员变量,SubClass 必须重新编译才能正常运行。原因是 fragile ivars 环境下,成员变量在对象内存中的偏移量是编译阶段确定的,作为常量 hardcode 到指令中(这一点不确定,求证之后回来 update )。如果 SuperClass 增删了成员变量,那么 SubClass 的成员变量在内存中的偏移量就会变成错误的,因为 SubClass 的成员变量是排布在 SuperClass 的成员变量之后的,SuperClass 的成员变量的增删会导致 SubClass 成员变量的后移、迁移,使用原来的 offset 将无法取到正确的成员变量。

二、non-fragile ivars 是如何解决问题的,原理是什么

    “Every problem can be solved by adding a level of indirection”(From Optimizing App Startup Time Video)。non-fragile ivars 解决问题的关键是将成员变量 offset 从常量改为变量,在类加载之后按需去修复这个 offset 变量。(从资料推断得到,细节并不敢确定,求证之后回来 update)具体来说,
    1. offset 会从常量变成全局变量
    2. 这个全局变量地址会被存在 ivar_list_t - ivar_t - offset 这个字段下面,这样在类加载的时候 runtime 就知道去修改哪块内存
    3. 在类加载之后,按需去修复 offset。只有在基类真的增减成员变量的时候,再去修复 offset。在类的结构体里面有两个变量是做这个事情,instanceStart, instanceSize,如果子类的 InstanceStart 与父类的 instanceSize 不一致才需要修复。

三、既然是 non-fragile ivars,为什么 Category 不能增加成员变量?

    看过一些资料,理由并不是很让人信服。我觉得并不是做不到,只是现在没有做,现在不支持。我在 Optimizing App Startup Time Video 中找到答案,我觉得是因为 Category registration 是在 Non-fragile ivars offsets updated 之后进行的,所以无法支持增加成员变量,因为 offset 不会再去修复。大胆假设一下,如果 objective-c Category 要支持增加成员变量,只需要增加 ivar_t,加到 ivar_list_t 末尾,然后再修复一下 offset,就可以正常工作了。可能想简单了,不知道是否存在一些系统类已经被实例化了,不能在增加成员变量了。我理解只要这个类没有被实例化,就可以增加成员变量,成本问题。再去多想一点,我增加 var 和增加 method 是一样的,都是在 list 后面加一个 item,类的数据结构应该是 heap 的某个特殊区域,应该是 private,所以这个变化是进程之间相互隔离的

    如有错漏,请批评指正。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
谈Objective-C Block的实现发布时间:2022-07-12
下一篇:
ios学习路线—Objective-C(属性修饰符)发布时间:2022-07-12
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap