和runtime交互
Objective-C
程序和 runtime
系统有三种不同级别的交互。
- 通过
Objective-C
源代码 - 通过
Foundation framework
中NSObject
类定义的方法。 - 直接调用
runtime
方法。
Objective-C 源代码
大多数情况,runtime
默默无闻的在幕后自动工作。你仅仅需要书写和编译 Objective-C
代码即可。
当你编译包含 Objective-C
类和方法的时候,由于这门语言的动态特性,编译器将生成数据结构和方法调用。数据结构捕获了 class
的信息, category
的定义,protocol
的声明;他们包含了那些在 The Objective-C Programming Language 中定义和声明的 class
, protocol
,实例变量,方法选择器,以及其他从源代码中提取的信息。最重要的 runtime
方法就是发送消息,它被消息表达式所执行。 详见 Message
NSObject 方法
在 Cocoa
中,大多数类继承与 NSObject
,大多数对象继承他定义的方法(NSProxy 是一个例外)详见Message Forwarding。由于这种关系,每个对象和实例都有方法。然而,NSObject
仅仅定义了一些某些应该做的方法模板,它不提供所有必须的代码。
例如,NSObject
定义了一个 description
,这个方法用来返回描述这个类的字符串。在 GDB
调试的时候,打印一个对象的时候输出的字符串就是从这个方法返回的。NSObject
并不知道这个类包含什么,所以只是返回这个类的名字和地址。NSObject
的子类可以实现这个方法来返回更多的信息。例如 NSArray
这个类返回了它所包含的数据列表。
NSObject
的一些方法用于查询 runtime
系统的一些信息。这些方法允许对象执行自我检查。一些方法是类的实例方法,用来询问对象来确定它的类;isKindOfClass:
isMemberOfClass:
用来测试这个对象在继承链中的层级;respondsToSelector:
用来指示这个对象是否可以接收一个特定的消息;conformsToProtocol:
用来指示这个对象是否实现了具体协议的方法;methodForSelector:
用来返回实现该方法的地址。这些方法给了对象来确定自己的能力。
运行时方法
runtime
是一个动态的共享库, /usr/include/objc
目录下的头文件提供了这些方法和数据结构。大多数的方法允许你用纯 C 的方式去实现编译器在处理你的 Objective-C
代码时所做的工作。其他的基础方法导出到了 NSObject
类中。这些方法使得开发其他 runtime
接口和工具成为了可能。当用 Objective-C
编码的时候,并不需要这些。但是当用 Objective-C
编码的时候,runtime
可能更好用。所有的方法都在 Objective-C Runtime Reference
网友评论