运行时
消息传递
- 消息传递
消息传递是指一种在对象之间发送和接收消息的通信模式。在Objective-C中使用消息传递来调用类和类实例的方法。
一个发送消息的例子:[receiver messageWithParam: param1 andParam: param2];
以上示例由接收器(消息的目的地:类或类实例)和消息(由选择器和参数)组成。 - 消息传递过程
- 消息传递的关键元素
- 消息:向类或类实例发送的名称(选择器)和一系列参数。
- 方法:OC中的类或类实例方法。
- 方法绑定:接收向指定接收器发送的消息,并寻找和执行适当方法的处理过程。
选择器
- 选择器。
选择器是一种文本字符串,用于指明调用类或类实例中哪个方法。再次看发送消息的例子:
[receiver messageWithParam: param1 andParam: param2];
在这个例子中,消息部分除去参数,剩下的就是选择器:
messageWithParam:andParam:
当源代码被编译时,编译器会创建数据结构和函数调用语句,使用它们以动态的方式将接收器和消息选择器与方法的实现代码对于起来。在执行时,运行时系统利用这些信息找到并调用适当的方法。 - 选择器类型SEL。
选择器类型SEL是一种特殊的OC数据类型,是用于在编译源代码时替换选择器值的唯一标识。 - 创建SEL类型的变量。你可以写出这样的代码:
SEL myMethod = @selector(methodName);
SEL selector = NSSelectorFromString(@"methodName"); - 使用选择器类型的变量可以执行指定对象的方法。
[receiver messageWithParam: param1 andParam: param2];
可以写成[receiver performSelector:@selector(messageWithParam:andParam:)
withObject:param1
withObject:param2];
方法签名
方法签名定义了方法输入参数的数据类型和方法返回值类型。
动态类型
- 动态类型是指,在程序运行之前无法确定的类型。OC中使用id类型来支持该类型。
- 和静态类型相比,静态类型是在编译阶段确定,因此可以在编译阶段检查出错误;动态类型,类型的检查操作是运行时。
动态绑定
- 动态绑定是在运行程序时,将消息和方法对应起来的过程。
- 动态绑定实现了OOP的多态性。
动态方法决议
动态方法决议可以以动态的方式实现方法。OC中使用@dynamic指令告知编译器与属性关联的方法会以动态方式实现。
对象内省
- 对象内省可以理解为,对象的自我检查。
- 对象可以进行哪些自我检查。
1. [obj isKindOfClass:Class]检查接收器是Class的实例还是Class类子类的实例。
2. [obj respondsToSelector:@selector(选择器)]检查对象是否可以对指定消息作出响应。
3. [obj conformsToProtocol:@protocol(protocol)]检查对象是否遵守了指定协。
4. NSMethodSignature *signature = [obj methodSignatureForSelector:@selector(选择器)]获取指定选择器对的方法签名。
总结
本篇只是对OC的运行时进行了初步认识,主要是一些概念的理解,为以后深入了解打下基础。