当前位置:   article > 正文

runtime面试指北——基本数据结构

runtime面试指北——基本数据结构

引言

Objective-C是一门动态语言,在OC中方法的调用在编译期时并不能真正决定调用的是哪个方法。只有在真正运行时才会根据方法的名称找到对应的函数调用。也就是说只有编译器是不够的,还需要一个运行时系统 (runtime library) 来执行编译后的代码。而Objective-C语言的动态特性正是基于runtime

>
runtime官方指南
>
runtime API介绍

目前runtime存在两个版本LegacModernModern版本是在 Objective-C 2.0时候引入的。相对于Legac版本,Modern最值得注意的新特性是:当你对某个类的实例变量进行重新布局,编译器不需要重新编译该类的子类。即在Legac版本中,如果你更改了类的实例变量布局,编译器会重新对该类的子类重新编译。目前在iPhone的程序是使用的是Modern版本的runtime。而OSX上从v10.5及之后的版本开始在64位的程序使用Modern 版本,而其它程序(32位的Mac 程序)使用的是Legac版本。

runtime交互

在Objective-C中有三种完全不同层次的交互方式:

  1. Objective-C 源代码
  2. 使用Foundation框架内的NSObject定义的方法。
  3. runtime的函数。

Objective-C 源代码

在平时开发中,我们很少用到或者接触到直接调用runtime的API的情况,大多数情况下App的开发者一般只需要关心OC的代码如何编写、编译,而runtime会自动在幕后把我们写的源代码在编译阶段转换成运行时代码,在运行时确定对应的数据结构和调用具体哪个方法。

使用Foundation框架内的NSObject定义的方法

Cocoa中的大多数类都是继承于NSObect,这些继承于NSObject的类同时继承了NSObject的方法。需要特别注意的是NSProxy它并不在上述的类之中,关于NSProxy更多信息可以参考Message Forwarding

NSObect有些方法仅仅作为抽象接口提供,NSObect本身的实现可以本子类重载。比如NSObectdescription方法,NSObect的实现是仅返回该类内容的字符串,我们可以通过重写子类的description方法。提供更多的信息,例如:重写NSArraydescription方法我们可以打印出数组中所有元素的内容。

官方指南中还提到了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:检查对象是否实现了指定协议类的方法ÿ

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/1022545
推荐阅读
相关标签
  

闽ICP备14008679号