美文网首页
详解Runtime运行时机制

详解Runtime运行时机制

作者: King_Liu | 来源:发表于2016-10-26 13:24 被阅读19次
    • 引言
    • 简介
    • 与Runtime交互
    • Runtime术语
    • 消息
    • 动态方法解析
    • 消息转发
    • 健壮的实例变量(Non Fragile ivars)
    • Objective-C Associated Objects
    • Method Swizzling
    • 总结

    引言

    曾经觉得Objc特别方便上手,面对Cocoa中大量的API,只知道简单的查文档和调用。还记得初学Objective-C时把[receiver message]当成简单的方法调用,而无视了"发送消息"这句话的深刻含义。其实[receiver message]会被编译器转化为:

    objc_msgSend(receiver, selector)
    

    如果消息含有参数,则为:

    objc_msgSend(receiver,selector,arg1,arg2,...)
    

    如果消息的接受者能够找到对应的selector,那么就相当于直接执行了接受者这个对象的特定方法;否则,消息要么被转发,或是临时向接收者动态添加这个selector对应的实现内容,要么就干脆玩完崩溃掉。
    现在可以看出[receiver message]真的不是一个简简单单的方法调用。因为这只是在编译阶段确定了要向接受者发送message这条消息,而receive将要如何响应这条消息,那就要看运行时发生的情况来决定了。
    Objective-C 的Runtime铸就了它动态语言的特性,这些深层次的知识虽然平时写代码用的少一些,但是却是每个Objc程序员要了解的。

    简介

    因为Objc是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行时。也就是说只有编译器是不够的,还需要一个运行时系统(runtime system)来执行编译后的代码。这就是Objective-C Runtime系统存在的意义,它是整个Objc运行框架的一块基石。

    Runtime其实有两个版本:"modern"和"legacy"。我们现在用的Objective-C2.0采用的是现行(Modern)版的Runtime系统,只能运行在iOS和OS X 10.5之后的64位程序中。而OS X较老的32位程序仍采用Objective-C 1中的(早期)Legacy版本的Runtime系统。这两个版本最大的区别在于当你更改一个类的实例变量的布局时,在早期版本中你需要重新编译它的子类,而现行版就不需要。

    Runtime基本是用C和汇编写的,可见苹果为了动态系统的高效而作出的努力。你可以在这里下到苹果维护的开源代码。苹果和GNU各自维护一个开源的runtime版本,这两个版本之间都在努力的保持一致。

    与Runtime交互

    Objc从三种不同的层级上与Runtime系统进行交互,分别是通过Objective-C源代码,通过Foundation框架的NSObject类定义的方法,通过对runtime函数的直接调用。

    Objective-C源代码

    相关文章

      网友评论

          本文标题:详解Runtime运行时机制

          本文链接:https://www.haomeiwen.com/subject/wfyduttx.html