追溯iOS方法找不到时的处理过程,绝妙解析!
2023-12-27 11:16:23
方法快速查找和慢速查找过程如前文所述,如果方法找不到会做什么呢,有没有挽救的机会呢?本文将对这些问题进行探究。
一、Objective-C消息转发机制
Objective-C的消息转发机制,提供了一种在找不到方法时动态处理消息的方式,程序员可以自定义消息处理过程,以实现更灵活和强大的功能。
消息转发机制主要分为两个步骤:
-
方法决议 :在找不到方法时,系统会先调用resolveInstanceMethod:或resolveClassMethod:方法,尝试动态决议方法。如果方法决议成功,则继续执行消息发送过程;否则,进入下一步。
-
消息转发 :如果方法决议失败,系统会调用forwardInvocation:方法,将消息转发给其他对象处理。程序员可以通过重写forwardInvocation:方法,自定义消息处理逻辑。
二、方法决议
方法决议允许程序员在运行时动态添加方法。Objective-C提供了两个方法来实现方法决议:resolveInstanceMethod:和resolveClassMethod:。
-
resolveInstanceMethod: 当找不到实例方法时,系统会调用resolveInstanceMethod:方法,尝试动态决议实例方法。如果方法决议成功,则继续执行消息发送过程;否则,进入消息转发阶段。
-
resolveClassMethod: 当找不到类方法时,系统会调用resolveClassMethod:方法,尝试动态决议类方法。如果方法决议成功,则继续执行消息发送过程;否则,进入消息转发阶段。
三、消息转发
消息转发允许程序员在找不到方法时,将消息转发给其他对象处理。Objective-C提供了forwardInvocation:方法来实现消息转发。
当方法决议失败时,系统会调用forwardInvocation:方法,将消息转发给其他对象处理。程序员可以通过重写forwardInvocation:方法,自定义消息处理逻辑。
四、实例方法和类方法的异同
实例方法和类方法是Objective-C中两种不同的方法类型。实例方法与特定实例相关,而类方法与类本身相关。
-
实例方法: 实例方法与特定实例相关,只能通过实例调用。实例方法可以访问实例变量和实例方法。
-
类方法: 类方法与类本身相关,可以通过类名或实例调用。类方法可以访问类变量和类方法。
总结
Objective-C的消息转发机制提供了一种在找不到方法时动态处理消息的方式,程序员可以自定义消息处理过程,以实现更灵活和强大的功能。
方法决议允许程序员在运行时动态添加方法。消息转发允许程序员在找不到方法时,将消息转发给其他对象处理。
实例方法与特定实例相关,只能通过实例调用。类方法与类本身相关,可以通过类名或实例调用。