今天,小萝莉就要给大家分享规避此类问题的终极利器 —— ForwardInvocation(消息重定向)。...一、崩溃问题产生的过程 知识回顾 Objective-C的方法调用实际是一种消息传递,当向Objective-C对象发送一个消息时,Runtime如果在当前类及父类中找不到此selector对应的方法,...“臣妾”真的做不到 —— 消息转发流程 Objective-C的方法调用的消息传递过程按照如下流程执行: ?...:方法时,不用调用super forwardInvocation:方法,否则,应用仍然会崩溃。...三、小结 以上内容即是萝莉给大家分享的全部内容,绝对是规避Unrecognized selector sent to instance xxx崩溃问题的利器,而实际上,崩溃的发生和规避的方式都是由Objective-C
苹果官方文档Objective-C Runtime Programming Guide 一、简介 Objective-C语言从编译时和链接时到运行时,推迟了尽可能多的决策。...运行时系统作为Objective-C语言的一种操作系统来使得Objective-C工作的。 本文档查看NSObject类以及Objective-C程序如何与运行时系统交互。...您只需编写和编译Objective-C源代码即可使用它。 编译包含Objective-C类和方法的代码时,编译器将创建实现该语言动态特性的数据结构和函数调用。...forwardInvocation:方法也可以将多个消息合并为一个响应。 forwardInvocation:做的是实现者。 但是,它提供的链接转发链中对象的机会为程序设计提供了可能性。...如果有这个方法,该消息永远不会达到forwardInvocation: 转发与多重继承 转发消息模仿继承,可以用来为Objective-C程序提供多重继承的一些效果。
1、错误 先看一个常见的错误 运行一个类没有的实例方法,就会报错‘unrecognized selector sent to instance’ 我们知道,Objective-C的方法实际是是消息发送...所以只好在调用这个方法之前将问题解决 2、解决方案 在methodSignatureForSelector阶段将找不到的Selector添加到NSObject里去, 在forwardInvocation...respondsToSelector:selector]) { [anInvocation invokeWithTarget:self]; }else{ [self ht_forwardInvocation...[[self class] instanceMethodSignatureForSelector:aSelector]; return methodSignature; } - (void)forwardInvocation...respondsToSelector:selector]) { [anInvocation invokeWithTarget:self]; }else{ [self forwardInvocation
而在Objective-C中,类似 [Receiver message] 这种语法并不会立即执行 message 这个方法的代码。...消息传递的过程 在 Objective-C 中,类、对象和方法都是一个 C 的结构体,从 objc/objc.h 头文件中,我们可以找到他们的定义。...但是在这个异常抛出之前,我们的 Objective-C 尝试过用三种方法来拯救我们的程序。...总结 Objective-C 中给一个对象发送消息会经过以下几个步骤: 在对象类的 dispatch table 中尝试找到该消息。...利用 Objective-C 的 Runtime 特性,我们可以自己来对语言进行扩展,解决项目开发中的一些设计和技术问题。
for the dynamic properties of the Objective-C language, and as such is linked to by all Objective-C...正式runtime这一个库给予了Objective-C language动态的属性, 所有的OC App都可以直接使用它 You typically don't need to use the Objective-C...进入消息重定向 - (id)forwardingTargetForSelector:(SEL)aSelector, 如果有指定消息接收对象则将消息转由接收对象响应 否则继续 ->开始消息转发 - (void)forwardInvocation...最后如果前面都没有处理就会进入到消息转发, 我们可以通过重写 - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector; - (void)forwardInvocation...[anInvocation invokeWithTarget:c]; 34 } 35 36 else { 37 38 [super forwardInvocation
通过实现我们自己的 forwardInvocation: 方法,我们可以在该方法实现中将消息转发给其它对象。...注意: forwardInvocation: 方法只有在消息接收对象中无法正常响应消息时才会被调用。...否则,forwardInvocation: 将不可能会被调用。 ?...上一篇消息发送,我们知道Objective-C语言动态语言。比如Car这个对象里面只声明没有实现函数名为fly的函数,编译器编译的时候会不会通过呢。 ?...Paste_Image.png 通过运行程序,可以看出在语言中Objective-C只声明并且没有实现方法编译器依然能够通过,但是运行期间则会因为获取不到实际执行的方法而抛出异常。 消息转发验证 ?
runtime 是一套用C语言提供的 API,Objective-C 代码最终都会被编译器转化为运行时代码,通过消息机制决定了不同函数调用或转发方式,因此 runtime成为了 Objective-C...Objective-C 源代码 平时开发中编写的 Objective-C 代码,其背后是 runtime 的运行工作。类、方法、协议等都由 runtime 转化成C语言后用数据结构来定义。 2....:(NSInvocation *)anInvocation - (void)forwardInvocation:(NSInvocation *)anInvocation { NSLog(@"消息重定向执行函数...respondsToSelector:selector]) { [anInvocation invokeWithTarget:twoObj]; } else { return [super forwardInvocation...消息转发小扩展——实现Objective-C 多继承 利用消息转发可以实现 Objective-C 语言编程的多继承效果。
消息转发是一种功能强大的技术,可以大大增加Objective-C的表现力。什么是消息转发?简而言之,它允许未知的消息被困住并作出反应。...但在异常抛出前,Objective-C 的运行时会给你三次拯救程序的机会: Method resolution Fast forwarding Normal forwarding 2.1 动态方法解析:...Method Resolution 首先,Objective-C 运行时会调用 + (BOOL)resolveInstanceMethod:或者 + (BOOL)resolveClassMethod:...当一个对象由于没有相应的方法实现而无法响应某个消息时,运行时系统将通过forwardInvocation:消息通知该对象。...Objective-C 中给一个对象发送消息会经过以下几个步骤: 在对象类的 dispatch table 中尝试找到该消息。
而 Objective-C 语言 是一门动态语言。在编译阶段并不知道变量的具体数据类型,也不知道所真正调用的哪个函数。...Objective-C 语言 把一些决定性的工作从编译阶段、链接阶段推迟到 运行时阶段 的机制,使得 Objective-C 变得更加灵活。...消息机制的基本原理 Objective-C 语言 中,对象方法调用都是类似 [receiver selector]; 的形式,其本质就是让对象在运行时发送消息的过程。...Runtime 中的概念解析 3.1 objc_msgSend 所有 Objective-C 方法调用在编译时都会转化为对 C 函数 objc_msgSend 的调用。...所以我们可以在 -forwardInvocation: 方法中对消息进行转发。
一、前言 官方对于NSObject的解释如下: The root class of most Objective-C class hierarchies, from which subclasses inherit...a basic interface to the runtime system and the ability to behave as Objective-C objects....大意是:这个类是大多说 Objective-C类的基类, 为子类提供了访问运行时系统的基本接口,并使子类具有 Objective-C对象的基本能力....10.5, 2.0, 9.0, 1.0); /** methodSignatureForSelector:返回不为nil则调用该方法, 可以重写该方法将SEL转发给另一个对象 */ - (void)forwardInvocation...anInvocation OBJC_SWIFT_UNAVAILABLE(""); /** 获取方法签名, 对象没有找到SEL的IML时就会执行调用该方法, 可以重写该方法抛出一个函数的签名, 再由forwardInvocation
1、继承 继承是面向对象的三个基本特征(封装,继承,多态)之一,Objective-C语法中,是单继承。而多继承可以看作是单继承的扩展。...NSProxy是与NSObject并列的一个类, 它有两个运行时方法 - (void)forwardInvocation:(NSInvocation *)anInvocation; - (NSMethodSignature...NSString stringWithUTF8String:temp_method_name]]; } free(method_list); } 然后重写两个消息转发的方法 - (void)forwardInvocation...respondsToSelector:sel]) { [invocation invokeWithTarget:target]; } else { [super forwardInvocation
在这时forwardInvocation:方法会被执行,我们可以重写这个方法来定义我们的转发逻辑: - (void)forwardInvocation:(NSInvocation *)anInvocation...通过实现我们自己的 forwardInvocation: 方法,我们可以在该方法实现中将消息转发给其它对象。...注意: forwardInvocation: 方法只有在消息接收对象中无法正常响应消息时才会被调用。...参考链接 原文:Objective-C Runtime Apple官方文档:Objective-C Runtime Programming Guide Apple开源代码:Objective-C Runtime...源码 Objective-C runtime之运行时的基本特点 Understanding the Objective-C Runtime 最后,附上Runtime的基本使用:《Objective-C
unrecognized selector sent to instance xxxx 错误释义 给实体对象发送了不认识的消息,即对象调用方法出错(方法不存在或对象已被release) 错误基本原因 Objective-C...正确的方法实现应如下样式: - (void)loadDataOnBackground:(id) sender{ ... } 在代码中我们通常对Objective-C对象设置selector...因此,规范的使用API和Objective-C的机制是避免此类问题的前提,而对于此类问题,一般也是建议开发人员在调式阶段能够发现并解决,而非简单规避。...当然,为了应用在发布后的稳定性,我们也可以通过forwardInvocation机制避免应用出现崩溃。 后续小萝莉也会跟大家分享如何调式定位此类问题及forwardInvocation的使用方法。
文章目录 一、OC中的消息 二、消息查找 三、消息转发 1、动态方法解析 2、备援接收者(receiver) 3、完整的消息转发 一、OC中的消息 在对象上调用方法是Objective-C中常使用的功能...然后触发如下方法,其参数就是此对象: - (void)forwardInvocation:(NSInvocation *)anInvocation; 这个方法可以实现得很简单:只需改变调用目标,使消息在新目标上得以调用即可...signatureWithObjCTypes:"v@:@"]; } return [super methodSignatureForSelector:aSelector]; } - (void)forwardInvocation...([dog respondsToSelector:sel]) { [anInvocation invokeWithTarget:dog]; return; } [super forwardInvocation...参考:《Effective Objective-C 2.0》
2.0的遗留逻辑,但我们仍能从中获得一些有价值的信息,有兴趣的可以查看源代码 Objective-C 2.0 的头文件虽然没暴露出objc_class结构体更详细的设计,我们依然可以从Objective-C...在这时forwardInvocation:方法会被执行,我们可以重写这个方法来定义我们的转发逻辑: - (void)forwardInvocation:(NSInvocation *)anInvocation...当一个对象由于没有相应的方法实现而无法响应某消息时,运行时系统将通过 forwardInvocation: 消息通知该对象。...通过实现我们自己的 forwardInvocation: 方法,我们可以在该方法实现中将消息转发给其它对象。...注意: forwardInvocation: 方法只有在消息接收对象中无法正常响应消息时才会被调用。
以上你可能看不出它的价值,但是我们需要了解的是 Objective-C 是一门动态语言,它会将一些工作放在代码运行时才处理而并非编译时。...---- Runtime 的作用 Objc 在三种层面上与 Runtime 系统进行交互: 通过 Objective-C 源代码 通过 Foundation 框架的 NSObject 类定义的方法...通过对 Runtime 库函数的直接调用 Objective-C 源代码 多数情况我们只需要编写 OC 代码即可,Runtime 系统自动在幕后搞定一切,还记得简介中如果我们调用方法,编译器会将 OC...这里可以参考下美团技术团队的文章:深入理解 Objective-C: Category。...当一个对象由于没有相应的方法实现而无法相应某消息时,运行时系统将通过 forwardInvocation: 消息通知该对象。每个对象都继承了 forwardInvocation: 方法。
前提是实现NSCopying协议的copyWithZone:方法,否则会导致出现找不到selector的崩溃。**unrecognized selector s...
我们可以实现 forwardInvocation: 方法来对不能处理的消息做一些默认的处理,也可以将消息转发给其他对象来处理,而不抛出错误。 ...当一个对象由于没有相应的方法实现而无法响应某消息时,运行时系统将通过forwardInvocation: 消息通知该对象。...通过实现我们自己的 forwardInvocation:方法,我们可以在该方法实现中将消息转发给其它对象。 ...注意: forwardInvocation: 方法只有在消息接收对象中无法正常响应消息时才会被调用。...否则, forwardInvocation: 将不可能会被调用。 6.3 转发和多继承 转发和继承相似,可以用于为OC编程添加一些多继承的效果。
什么是Objective-C Objective-C,简称OC,是一种通用、高级、面向对象的编程语言。它扩展了标准的ANSI C编程语言, 将Smalltalk式的消息传递机制加入到ANSI C中。...Objective-C的商标权属于苹果公司,苹果公司也是这个编程语言的主要开发者。 苹果在开发NeXTSTEP操作系统时使用了Objective-C,之后被OS X和iOS继承下来。...现在Objective-C与Swift是OS X和iOS操作系统、及与其相关的API、Cocoa和Cocoa Touch的主要编程语言。 Objective-C是C语言的严格超集。...这意味着任何C语言程序不经修改就可以直接通过Objective-C编译器, 在Objective-C中使用C语言代码也是完全合法的。...Objective-C被描述为盖在C语言上的薄薄一层, 因为Objective-C的原意就是在C语言主体上加入面向对象的特性。OC项目中常用的拓展名如下: 扩展名 内容类型 .h 头文件。
领取专属 10元无门槛券
手把手带您无忧上云