美文网首页
对Runtime理解

对Runtime理解

作者: iChuck | 来源:发表于2017-10-25 21:58 被阅读8次

    runtime 是一套以C语言写的 是ios核心部分之一

    [receiver message];

    // 底层运行时会被编译器转化为:

    objc_msgSend(receiver, selector)

    // 如果其还有参数比如:

    [receiver message:(id)arg...];

    // 底层运行时会被编译器转化为:

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

    Runtime 的作用

    Objc 在三种层面上与 Runtime 系统进行交互:

    通过 Objective-C 源代码

    通过 Foundation 框架的 NSObject 类定义的方法

    通过对 Runtime 库函数的直接调用

    Objective-C 源代码

    多数情况我们只需要编写 OC 代码即可,Runtime 系统自动在幕后搞定一切,还记得简介中如果我们调用方法,编译器会将 OC 代码转换成运行时代码,在运行时确定数据结构和函数。

    通过 Foundation 框架的 NSObject 类定义的方法

    Cocoa 程序中绝大部分类都是 NSObject 类的子类,所以都继承了 NSObject 的行为。(NSProxy 类时个例外,它是个抽象超类)

    一些情况下,NSObject 类仅仅定义了完成某件事情的模板,并没有提供所需要的代码。例如 -description 方法,该方法返回类内容的字符串表示,该方法主要用来调试程序。NSObject 类并不知道子类的内容,所以它只是返回类的名字和对象的地址,NSObject 的子类可以重新实现。

    还有一些 NSObject 的方法可以从 Runtime 系统中获取信息,允许对象进行自我检查。例如:

    -class方法返回对象的类;

    -isKindOfClass: 和 -isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量);

    -respondsToSelector: 检查对象能否响应指定的消息;

    -conformsToProtocol:检查对象是否实现了指定协议类的方法;

    -methodForSelector: 返回指定方法实现的地址。

    通过对 Runtime 库函数的直接调用

    Runtime 系统是具有公共接口的动态共享库。头文件存放于/usr/include/objc目录下,这意味着我们使用时只需要引入objc/Runtime.h头文件即可。

    许多函数可以让你使用纯 C 代码来实现 Objc 中同样的功能。除非是写一些 Objc 与其他语言的桥接或是底层的 debug 工作,你在写 Objc 代码时一般不会用到这些 C 语言函数。对于公共接口都有哪些,后面会讲到。我将会参考苹果官方的 API 文档。

    相关文章

      网友评论

          本文标题:对Runtime理解

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