iOS底层原理(二):运行时研究(一)
运行
Objective-C扩展了C语言,并加入了面向对象特性和Smalltalk式的消息传递机制。而这个扩展的核心是一个用C和编译语言写的Runtime库。它是Objective-C面向对象和动态机制的基石。
Objective-C是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态得创建类和对象,进行消息传递和转发。理解Objective-C的运行时机制可以帮我们更好的了解这个语言,适当的时候还能对语言进行扩展,从系统层面解决项目中的一些设计或技术问题。一句话:学好运行时间,iOS躺着走
Runtime
其实有两个版本:“ modern
”和“ legacy
”。我们现在用的采用Objective-C 2.0
的是现行(Modern
)版的Runtime
系统,只能运行在iOS
和macOS 10.5
之后的64
位程序中。而较macOS
老的32
位程序仍采用Objective-C 1
中的(早期)Legacy
的版本Runtime
系统- 。这两个版本最大的区别在于当你更改一个类的实例变量的布局时,在早期版本中你需要重新编译它的子类,而现行版就不需要。
Runtime
基本是用C
和汇编
写的,可见苹果为了动态系统的高效而作出的努力。你可以在这里下到苹果维护的开源代码。苹果和GNU各自维护一个开源的运行时 / GNUStep版本,这两个版本之间都在努力的保持一致。
平时的业务中主要是使用官方Api,解决我们框架性的需求。
高级编程语言
想要成为可执行文件需要先编译为汇编语言再汇编为机器语言,机器语言也是计算机能够识别的唯一语言,但是OC
并不能直接编译为汇编语言,要先而是转写为纯C
语言再进行编译状语从句:汇编的操作,从OC
到C
语言的过渡就是由运行时来实现的。然而使用我们OC
进行面向对象开发,而C
语言更多的是面向过程开发,这就需要将面向对象的类转变为面向过程的结构体。
好我们先来看看与运行交互的三种方式:
- OC原生底层就是运行会会在后台执行比如方法的实质就是消息 对于大多数情况下,OC运行时系统自动的在后台运行。你只需编写和编译OC代码就能使用它。 当你编译包含OC类和方法的代码时,编译器创建用来实现语言动态特性的数据结构体和方法调用。数据结构获取类和类定义的信息和协议中定义的信息,包含了在“Objective-C编程语言”中对“定义类和协议”谈论的类和协议的对象,以及方法选择,实例变量模版,和其他葱源代码中提取出来的信息。运行时主要的一个功能是发送消息,正如在消息中的描述。它是由源代码的消息表达式调用的。
- 通过调用
NSObject
的方法间接调用运行时
这里给大家解释一下:以上方法都是在运行时会编译成响应的方法:- (BOOL)respondsToSelector:(SEL)aSelector
比如我们看编译会来到objc的这里
上面的两部跳动,都是给下面的方法做铺垫的,的下面方法也。runtime
非常重要的方法,下面我们花点篇幅介绍一下
lookUpImpOrForward
这个方法里面篇幅很长里面介绍了以下几点:
- 如果缓存是YES,则从缓存中查找IMP。这里也就是说我们如果之前响应过的,在高速缓存存过,就不需要下面的操作了
- 判断类是否已经被创建,如果没有被创建,则将类实例化
- 第一次调用当前类的话,执行初始化的代码
- 尝试获取这个类的缓存(这里很多小伙伴就会质疑,为什么还要取一次内存,要知道OC是动态语言,在我们执行这个获取imp的时候,外界在开锁,解锁的时候是可以访问的,动态操作)
- 如果没有从缓存中查找到,则从方法列表中获取方法
- 如果还没有,就从父类缓存或者方法列表获取小鬼
- 如果没有找到,则尝试动态方法解析
- 如果没有IMP被发现,并且动态方法解析也没有处理,则进入消息转发阶段
还有里面关于
runtimeLock
运行时锁,加锁这里了read()
对读取,其中runtimeLock
的英文通过pthread_rwlock_t
实现的,更加底层的,如果大家感兴趣锁可以参考这篇互斥锁-读写锁-条件锁
以上设计了消息
,, 动态方法解析
还有消息转发
,我们在接下来的篇幅中还会更加深入研究。我们继续回来,第三种runtime
交互
- 直接调用
runtime
的API IPA的介绍篇幅,我们就放到下一篇。
研究学习,我是认真的!
相关文章
- 备份从android到ios系统文件,如何将音乐从安卓设备转移到iOS设备中「建议收藏」
- iOS上架详细通关教程(提交到AppStore)
- HBuilder X 连接苹果手机(IOS)详细教程。Windows: 连接iOS手机调试项目
- PlayCover for Mac(M1全屏运行ios应用软件)
- 【IOS实用玩机技巧】爱思助手 IPA 签名功能常见问题汇总(iOS上架)
- iOS底层原理(一):OC对象实际占用内存与开辟内存关系
- 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
- AnyTrans for iOS for mac(ios数据传输管理工具)
- iOS编译过程的原理和应用详解手机开发
- iOS定时通知详解手机开发
- iOS开发系列课程(06) — 常用控件介绍详解手机开发
- iOS之Runtime原理解读详解手机开发
- 操作系统比较:iOS 与 Linux 操作系统(ios与linux)
- iOS与Linux:新老技术的融合(ios与linux的关系)
- 移动端iOS技术实现Oracle数据库连接(ios联接oracle)
- iOS 轻松登录 Oracle 数据库(ios 登陆oracle)
- iOS让Oracle无处不在(ios支持oracle么)
- 谁说 iOS 就不适用Oracle(ios oracle软件)
- 火速围观,国外黑客成功在iPhone 7上越狱iOS 10
- iOS 15搜索体验大改进:涵盖网图、相册、锁屏访问等更多内容
- 深入理解iOS图文混排原理并自定义图文控件
- iOS 15支持手动关闭夜景模式 拍照算法大升级!
- iOS 15 Safari新变化:地址栏可根据用户偏好设置在顶部或底部
- 当iOS 15发布时微软的Outlook将停止支持iOS 13版和watchOS 6版