赞
踩
Objective-C是一门动态语言,在OC中方法的调用在编译期时并不能真正决定调用的是哪个方法。只有在真正运行时才会根据方法的名称找到对应的函数调用。也就是说只有编译器是不够的,还需要一个运行时系统 (runtime library) 来执行编译后的代码。而Objective-C语言的动态特性正是基于runtime
。
目前runtime
存在两个版本Legac和Modern。Modern版本是在 Objective-C 2.0时候引入的。相对于Legac版本,Modern最值得注意的新特性是:当你对某个类的实例变量进行重新布局,编译器不需要重新编译该类的子类
。即在Legac版本中,如果你更改了类的实例变量布局,编译器会重新对该类的子类重新编译。目前在iPhone的程序是使用的是Modern版本的runtime
。而OSX上从v10.5及之后的版本开始在64位的程序使用Modern 版本,而其它程序(32位的Mac 程序)使用的是Legac版本。
在Objective-C中有三种完全不同层次的交互方式:
runtime
的函数。在平时开发中,我们很少用到或者接触到直接调用runtime
的API的情况,大多数情况下App的开发者一般只需要关心OC的代码如何编写、编译,而runtime
会自动在幕后把我们写的源代码在编译阶段转换成运行时代码,在运行时确定对应的数据结构和调用具体哪个方法。
在Cocoa
中的大多数类都是继承于NSObect
,这些继承于NSObject
的类同时继承了NSObject
的方法。需要特别注意的是NSProxy
它并不在上述的类之中,关于NSProxy
更多信息可以参考Message Forwarding。
在NSObect
有些方法仅仅作为抽象接口提供,NSObect
本身的实现可以本子类重载。比如NSObect
的description
方法,NSObect
的实现是仅返回该类内容的字符串,我们可以通过重写子类的description
方法。提供更多的信息,例如:重写NSArray
的description
方法我们可以打印出数组中所有元素的内容。
在官方指南中还提到了NSObect
以下方法就是通过“质询”runtime
来获取信息的。d
- (Class)class OBJC_SWIFT_UNAVAILABLE("use 'anObject.dynamicType' instead");
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- (BOOL)respondsToSelector:(SEL)aSelector;
- (IMP)methodForSelector:(SEL)aSelector;
-class方法返回对象的类;
-isKindOfClass: 和 -isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量);
-respondsToSelector: 检查对象能否响应指定的消息;
-conformsToProtocol:检查对象是否实现了指定协议类的方法ÿ
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。