首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

小萝莉说Crash(二): Unrecognized selector xxx 之 ForwardInvocation

今天,小萝莉就要给大家分享规避此类问题的终极利器 —— ForwardInvocation(消息重定向)。...一、崩溃问题产生的过程 知识回顾 Objective-C的方法调用实际是一种消息传递,当向Objective-C对象发送一个消息时,Runtime如果在当前类及父类中找不到此selector对应的方法,...“臣妾”真的做不到 —— 消息转发流程 Objective-C的方法调用的消息传递过程按照如下流程执行: ?...:方法时,不用调用super forwardInvocation:方法,否则,应用仍然会崩溃。...三、小结 以上内容即是萝莉给大家分享的全部内容,绝对是规避Unrecognized selector sent to instance xxx崩溃问题的利器,而实际上,崩溃的发生和规避的方式都是由Objective-C

2.4K50

Objective-C Runtime编程指南(1)

苹果官方文档Objective-C Runtime Programming Guide 一、简介 Objective-C语言从编译时和链接时到运行时,推迟了尽可能多的决策。...运行时系统作为Objective-C语言的一种操作系统来使得Objective-C工作的。 本文档查看NSObject类以及Objective-C程序如何与运行时系统交互。...您只需编写和编译Objective-C源代码即可使用它。 编译包含Objective-C类和方法的代码时,编译器将创建实现该语言动态特性的数据结构和函数调用。...forwardInvocation:方法也可以将多个消息合并为一个响应。 forwardInvocation:做的是实现者。 但是,它提供的链接转发链中对象的机会为程序设计提供了可能性。...如果有这个方法,该消息永远不会达到forwardInvocation: 转发与多重继承 转发消息模仿继承,可以用来为Objective-C程序提供多重继承的一些效果。

82120
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    runtime的那些事(一)——runtime基础介绍

    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 语言编程的多继承效果。

    1.6K20

    iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API不兼容奔溃,模拟多继承)

    消息转发是一种功能强大的技术,可以大大增加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 中尝试找到该消息。

    2.1K11

    小萝莉说Crash(一):Unrecognized selector sent to instance xxxx

    unrecognized selector sent to instance xxxx 错误释义 给实体对象发送了不认识的消息,即对象调用方法出错(方法不存在或对象已被release) 错误基本原因 Objective-C...正确的方法实现应如下样式: - (void)loadDataOnBackground:(id) sender{ ... } 在代码中我们通常对Objective-C对象设置selector...因此,规范的使用API和Objective-C的机制是避免此类问题的前提,而对于此类问题,一般也是建议开发人员在调式阶段能够发现并解决,而非简单规避。...当然,为了应用在发布后的稳定性,我们也可以通过forwardInvocation机制避免应用出现崩溃。 后续小萝莉也会跟大家分享如何调式定位此类问题及forwardInvocation的使用方法。

    7.6K40

    iOS_Objective-C 消息发送(消息查找 及 消息转发)过程

    文章目录 一、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》

    96820

    Objective-C Runtime 详解

    2.0的遗留逻辑,但我们仍能从中获得一些有价值的信息,有兴趣的可以查看源代码 Objective-C 2.0 的头文件虽然没暴露出objc_class结构体更详细的设计,我们依然可以从Objective-C...在这时forwardInvocation:方法会被执行,我们可以重写这个方法来定义我们的转发逻辑: - (void)forwardInvocation:(NSInvocation *)anInvocation...当一个对象由于没有相应的方法实现而无法响应某消息时,运行时系统将通过 forwardInvocation: 消息通知该对象。...通过实现我们自己的 forwardInvocation: 方法,我们可以在该方法实现中将消息转发给其它对象。...注意: forwardInvocation: 方法只有在消息接收对象中无法正常响应消息时才会被调用。

    1.2K20

    iOS开发-Runtime详解

    以上你可能看不出它的价值,但是我们需要了解的是 Objective-C 是一门动态语言,它会将一些工作放在代码运行时才处理而并非编译时。...---- Runtime 的作用 Objc 在三种层面上与 Runtime 系统进行交互: 通过 Objective-C 源代码 通过 Foundation 框架的 NSObject 类定义的方法...通过对 Runtime 库函数的直接调用 Objective-C 源代码 多数情况我们只需要编写 OC 代码即可,Runtime 系统自动在幕后搞定一切,还记得简介中如果我们调用方法,编译器会将 OC...这里可以参考下美团技术团队的文章:深入理解 Objective-C: Category。...当一个对象由于没有相应的方法实现而无法相应某消息时,运行时系统将通过 forwardInvocation: 消息通知该对象。每个对象都继承了 forwardInvocation: 方法。

    73690

    iOS开发-Runtime详解

    以上你可能看不出它的价值,但是我们需要了解的是 Objective-C 是一门动态语言,它会将一些工作放在代码运行时才处理而并非编译时。...---- Runtime 的作用 Objc 在三种层面上与 Runtime 系统进行交互: 通过 Objective-C 源代码 通过 Foundation 框架的 NSObject 类定义的方法...通过对 Runtime 库函数的直接调用 Objective-C 源代码 多数情况我们只需要编写 OC 代码即可,Runtime 系统自动在幕后搞定一切,还记得简介中如果我们调用方法,编译器会将 OC...这里可以参考下美团技术团队的文章:深入理解 Objective-C: Category。...当一个对象由于没有相应的方法实现而无法相应某消息时,运行时系统将通过 forwardInvocation: 消息通知该对象。每个对象都继承了 forwardInvocation: 方法。

    73470

    【IOS开发高级系列】Objective-c Runtime专题总结

    我们可以实现 forwardInvocation: 方法来对不能处理的消息做一些默认的处理,也可以将消息转发给其他对象来处理,而不抛出错误。        ...当一个对象由于没有相应的方法实现而无法响应某消息时,运行时系统将通过forwardInvocation: 消息通知该对象。...通过实现我们自己的 forwardInvocation:方法,我们可以在该方法实现中将消息转发给其它对象。          ...注意: forwardInvocation: 方法只有在消息接收对象中无法正常响应消息时才会被调用。...否则, forwardInvocation: 将不可能会被调用。 6.3 转发和多继承         转发和继承相似,可以用于为OC编程添加一些多继承的效果。

    38030

    Objective-C笔记

    什么是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 头文件。

    95640
    领券