美文网首页runtimeiOS Developer
类执行方法的过程与运行时

类执行方法的过程与运行时

作者: 东健FO_OF | 来源:发表于2017-03-24 00:53 被阅读78次

大家都知道,调用一个未声明方法大多数情况下会崩溃,崩溃信息就是unrecognized selector sent to instance;是的,的确大多数情况下是这样的,但是有了运行时就不一定了,这就是我今天的主题——“安全类”

(哈哈哈,自己随便起的名字,会不会有点土。。。)

常规情况下的确是会崩溃,不过要想让它不崩溃我们就要来研究一下一个对象去执行方法的过程

上代码:

先建立一个类,(我平时喜欢建立一个工程“打草稿”,就从草稿里面随便拿一个类来说吧😄)

就是这样一个DrawImageColor这个类,创建了一个对象,然后利用performSelector去执行一个未声明的方法,不能直接[image add]这样调用,这样编译都不会通过,会直接报错,所以为了通过编译就采用这样的方式去调用

见证奇迹:

这里的Log是我专门打印的,为了证明这个运行成功了,并且并没有崩溃,然后开始介绍为什么不崩溃了!

(重点来了)方法调用的顺序:

有这几个方法要认识一下

(1)、+ (BOOL)resolveInstanceMethod:(SEL)sel;

说明:当一个对象调用未实现的方法,会调用这个方法处理,并且会把对应的方法列表传过来

(2)、- (id)forwardingTargetForSelector:(SEL)aSelector

说明:当1⃣️方法返回NO的时候(代表当前类无法执行该方法),就会执行这个方法返回一个可以执行这个方法的对象

(3)、- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector

说明:当2⃣️方法返回的对象可以执行该方法的时候,那么程序就运行结束了,但是如果上一个方法返回的对象是nil或者self的时候就会执行③方法

(4)、- (void)forwardInvocation:(NSInvocation *)anInvocation

说明:当3⃣️方法返回的是一个有效的NSMethodSignature对象(怎么叫做有效的对象可以自己去查查,哈哈)的时候会执行⑤方法,当③方法返回的是一个nil的时候就会执行6⃣️方法

(5)、- (void)forwardInvocation:(NSInvocation *)anInvocation

说明:到这里说明3⃣️方法中返回的是有效的NSMethodSignature对象,所以会执行NSMethodSignature对象中的forwardInvocation函数

(6)、- (void)doesNotRecognizeSelector:(SEL)aSelector

说明:到这里程序会抛出异常并结束。

啊,终于屡完了过程,写博客果然是个辛苦活,😖

实现“永不崩溃的类”:

由上面的方法执行顺序我们可以这样分析:

我们应该在1⃣️方法中“处理方法”,

在2⃣️方法中返回的肯定是个nil了,要不然叫什么“永不崩溃的类”,应该改名叫“永远甩锅的类”😒

在3⃣️方法中我们要返回一个有效的NSMethodSignature对象,但是这个创建的过程中很麻烦,然后有人说可以返回nil,请注意,返回了nil之后会执行6⃣️方法直接抛出异常崩溃了。所以我现在想用运行时来解决它,我们要在方法1⃣️就解决这个问题😁

runtime:

运行时肯定离不开它,在这里我就截个图针对这种情况说一下它会用到哪个方法,其实就一个方法,

在这里就会多这么一句代码,这里也可以用来做动态添加方法的功能,不过现在不说这个功能,我就是想实现它不崩溃,所以如上图就使用class_addMethod添加一个已经实现的方法,注意这个方法要是C语言的形式去实现的,然后就不会崩溃了,大家可以试一下,我在想,如果写一个NSObject的分类,把这些方法用到NSObject的分类里去,那样会不会所有的类都不会因为方法未声明崩溃了呢?😃

所以我无聊做了这个类:

用法:

不过最后想了想,没多大意义,就删了😶

相关文章

  • 类执行方法的过程与运行时

    大家都知道,调用一个未声明方法大多数情况下会崩溃,崩溃信息就是unrecognized selector sent...

  • iOS runtime--交换方法

    概述 OC对象在接收到消息后,在运行时才确定执行哪个方法,而这个“确定”的过程是根据选择子名称在类的方法列表中找到...

  • Python模板方法模式

    模板方法模式,在父类中确定步骤的执行过程,子类无法更改执行过程顺序。

  • 01 JVM 运行时数据区

    1. 运行时数据区 java运行过程中把内存分为几个不同区域,方法区存储类的结构信息,代码解释执行,像刷题的表达式...

  • Android ART执行类方法的过程

    7.0之前ART只有AOT模式,7.0之后采用解释、JIT、AOT混合执行。方法调用有如下几种流程:机器码-->机...

  • 多线程Executor

    一、相关类简单介绍二、各类之间的关系图三、 execute方法执行过程 相关类简单介绍 1、Executor:执行...

  • 运行时-方法替换

    运行时 方法替换的时候需要执行两步:第一步:类获取实例方法(class_getInstanceMethod)第二步...

  • iOS-分类的实现

    一、原理 分类是运行时决议,在编译的过程中只是转化为可执行文件,并没有为类生成新方法。 由图可以看出我们可以为分类...

  • JavaForAndroid15

    进程与线程一、线程的执行过程 二、实现线程的两种方法1、定义一个线程类,需继承Thread类class First...

  • JVM总结-个人向

    内存区域 JVM的主要组成部分和作用JVM整体来看分为:运行时数据区,类加载子系统、执行引擎以及本地方法接口(与n...

网友评论

本文标题:类执行方法的过程与运行时

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