与Runtime交互
Objc从三种不同的层级上可以与Runtime系统进行交互:
1.通过Objective-c源代码
2.通过Foundation框架下的NSObject类定义的方法
3.通过对runtime函数的直接使用
Objective-C源代码
大部分情况下你就只管写你的Objc代码就行,runtime系统回自动的在幕后辛勤劳作着。
还记得引言中举得例子吧,消息的执行会使用到一些编译器为实现动态语言特性而创建的数据结构和函数,Objc中的类、方法和协议等在runtime中都由一些数据结构来定义,这些内容如 objc_msgSend
函数及其参数列表中的id
和SEL
都是。
NSObject的方法
Cocoa中大多数类都继承于NSObject类,也就自然继承了它的方法。最特殊的例外是NSProxy
,它是个抽象超类,它实现了一些消息转发有关的方法,可以通过继承的它来实现一个其他类的替身类或是虚拟出一个不存在的类,说白了就是领导把自己展现给大家风光无限,但是把活儿都交给幕后小弟去干。
有的NSObject
中的方法起到了抽象接口的作用,比如� description 方法需要你重载它并为你定义的类提供描述内容。NSObject还有些方法能在运行时获得类的信息,并检查一些特性,比如class
返回对象的类;isKindOfClass:
和isMemberOfClass:
则检查对象是否在指定的类继承体系中; respondsToSelector:
检查对象能否响应指定的消息; conformsToProtocol:
检查对象是否实现了指定协议类的方法;methodForSelector:
则返回指定方法实现的地址。
Runtime的函数
Runtime 系统是一个由一系列函数和数据结构组成的,具有公共接口的动态共享库。头文件存放于/usr/include/objc
目录下。许多函数允许你用纯C 代码来重复实现Objc中同样的功能。虽然有一些方法构成了```NSObject类的基础,但是你在写Objc代码时一般是一般不会用到这些函数的,除非是写一些Objc与其他语言的桥接或是底层的debug工作。在Objective-C Runtime Reference中有对 Runtime 函数的详细文档。