美文网首页
IOS runtime简介

IOS runtime简介

作者: O2Space_Xiu | 来源:发表于2016-11-25 19:03 被阅读0次

runtime是什么###

掌握runtime是做好iOS开发,或是深刻掌握Objective C所必需理解的东西。公司面试都喜欢问:你对runtime熟悉吗?并不是runtime在开发中经常用到,我认为它是OC最核心的部分,只有掌握好它,你才能理解其底层的原理,而不是做一个只会造轮子的码农。

runtime是一个c和汇编写的动态库,它就像一个小小的系统,将OC和C紧密关联,这个系统主要做两件事 :
1、封装C语言的结构体和函数,让开发者在运行时创建、检查或者修改类、对象和方法等等。
2、传递消息,找出方法的最终执行代码。

听起来蛮抽象的,我们来点通俗的吧?没问题~~
我们先写一句OC的代码

[zhangsan walkTheDog];

那么在运行时runtime会将它转化成C语言的代码

objc_msgSend(zhangsan, @selector(walkTheDog));

这个方法就是发送消息的方法,类似这样的方法runtime提供了很多,比如:

objc_property_t * class_copyPropertyList ( Class cls, unsigned int *outCount ); // 获取属性列表
Method * class_copyMethodList ( Class cls, unsigned int *outCount ); // 获取所有方法的数组
BOOL class_addMethod ( Class cls, SEL name, IMP imp, const char *types ); // 添加方法

那么我们可以利用这些方法干点什么?

1、遍历对象的属性比如,看看zhangsan的有哪些属性(身高:180、年龄:18)

2、动态添加/修改属性,动态添加/修改/替换方法比如,修改zhangsan的身高为190、年龄为20,替换walkTheDog方法(变成walkTheBigDog),给他添加一个新方法(walkTheCat)等等

3、动态创建类/对象/协议等等比如,创建一个新的对象:lisi

4、方法拦截调用比如,给zhangsan发送一个walkTheDog消息,但是zhangsan不知道怎么walk啊(没实现该方法),那我们可以拦截下,给该方法动态添加一个实现,甚至可以讲该方法定向或者打包给lisi(其他对象),让lisi来walk。

以上就是runtime的通俗解释,只是稍微举个例子,更多用法大家可以发挥聪明才智,举一反三。

方法调用流程####

通俗地讲,调用方法(包含实例方法和类方法)相当于給一个对象发送消息。

所以,实际上,类本身也是一个对象(关于Class这一块就不再这里展开了)。
当我们调用一个方法时,是这样的:
Instance:调用实例方法时,会到对象所属的类的方法列表中查找。
Class:调用类方法时,会到类的metaClass的方法列表中查找。

下面以实例对象调用方法[blackDog walk] 为例描述方法调用的流程:

1、编译器会把`[blackDog walk]`转化为`objc_msgSend(blackDog,SEL)`,SEL为@selector(walk)。

2、Runtime会在blackDog对象所对应的Dog类的方法缓存列表里查找方法的SEL

3、如果没有找到,则在Dog类的方法分发表查找方法的SEL。(类由对象isa指针指向,方法分发表即methodList)

4、如果没有找到,则在其父类(设Dog类的父类为Animal类)的方法分发表里查找方法的SEL(父类由类的superClass指向)

5、如果没有找到,则沿继承体系继续下去,最终到达NSObject类。

6、如果在234的其中一步中找到,则定位了方法实现的入口,执行具体实现

7、如果最后还是没有找到,会面临两种情况:
"(1) 如果是使用`[blackDog walk]`的方式调用方法"
"(2) 使用`[blackDog performSelector:@selector(walk)]`的方式调用方法"

第一种情况编译器会报错,第二种需要到运行时才能确定对象能否接收指定的消息,这时候会进入消息转发的流程:

消息转发流程####

1、动态方法解析接收到未知消息时(假设blackDog的walk方法尚未实现),<code>runtime会调用+resolveInstanceMethod:(实例方法)</code>或者<code>+resolveClassMethod:(类方法)</code>
在该方法中,我们可以給未知消息新增一个已经实现了的方法。

void walkFunc(id self, SEL _cmd) { 
  //let the dog walk
}
+ (BOOL)resolveInstanceMethod:(SEL)sel {
  NSString * selString = NSStringFromSelector(sel);
  if ([selString isEqualToString:@"walk"]) {
    class_addMethod(self.class, @selector(walk), (IMP)walkFunc, "@:");
  }
  return [super resolveInstanceMethod:sel];
}

2、备用接收者
如果以上方法没有做处理,runtime会调用<code>- (id)forwardingTargetForSelector:(SEL)aSelector</code>方法。
如果该方法返回了一个非nil(也不能是self)的对象,而且该对象实现了这个方法,那么这个对象就成了消息的接收者,消息就被分发到该对象。
适用情况:通常在对象内部使用,让内部的另外一个对象处理消息,在外面看起来就像是该对象处理了消息。
比如:blackDog让女朋友whiteDog来接收这个消息

- (id)forwardingTargetForSelector:(SEL)aSelector {
  NSString * selString = NSStringFromSelector(aSelector);
  if ([selString isEqualToString:@"walk"]) {
    return self.whiteDog;
  }
  return [super forwardingTargetForSelector:aSelector];
}

3、完整消息转发
在<code>- (void)forwardInvocation:(NSInvocation *)anInvocation</code>方法中选择转发消息的对象,其中anInvocation对象封装了未知消息的所有细节,并保留调用结果发送到原始调用者。
比如:blackDog将消息完整转发給主人dogOwner来处理

- (void)forwardInvocation:(NSInvocation *)anInvocation{
  if ([DogOwner instancesRespondToSelector:anInvocation.selector]) {
    [anInvocation invokeWithTarget:self.dogOwner];
  }
}

4、如果在以上三个方法都没有处理未知消息,则会引发异常。

初学者需要更深入地学习:
1、基本概念:Class、Ivar、Method等等
2、消息转发机制
3、在<objc/runtime.h>中理解runtime提供的方法和功能
4、在实际开发中如何灵活运用runtime

原文链接:http://www.jianshu.com/p/f493bc6a949e

相关文章

  • iOS Objective-C 方法的本质

    1.Runtime简介 1.1 Runtime Runtime官方文档 作为一名iOS开发人员,说去Runtime...

  • Runtime

    简介 iOS开发-Runtime详解(简书) 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其...

  • IOS runtime简介

    runtime是什么### 掌握runtime是做好iOS开发,或是深刻掌握Objective C所必需理解的东西...

  • iOS Runtime简介

    1. Runtime 简介 1.1 Runtime Runtime官方文档[https://developer.a...

  • iOS Runtime

    Runtime 简介: Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,...

  • iOS Runtime原理及使用

    本文参考七七 iOS Runtime原理及使用,非常感谢该作者 runtime简介 因为Objc是一门动态语言,所...

  • iOS runtime(三)runtime之method(1)m

    iOS runtime(一)runtime之Property 详尽iOS runtime(二)runtime之Iv...

  • iOS runtime 运行时( - 俗谈)

    iOS runtime 运行时( - 俗谈)iOS runtime 运行时( 二 深谈)iOS runtime 运...

  • iOS runtime整理

    runtime简介 Runtime 又叫运行时,是一套底层的 C 语言 API,是 iOS 系统的核心之一。开发者...

  • iOS面试-Runtime简介

    本文主要介绍runtime的五点 Runtime简介 Runtime(消息机制) Runtime方法调用流程 Ru...

网友评论

      本文标题:IOS runtime简介

      本文链接:https://www.haomeiwen.com/subject/nvrwpttx.html