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:检查对象是否实现了指定协议类的方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FY_Chao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值