Objective-C中的消息转发在具体实战中有什么用?

我知道OC是一门动态语言,可以在运行期动态地给一个类添加方法。但是最近看到OC的消息转发机制时感到非常疑惑,如果明明可以给一个类写一个方法,为何还需要…
关注者
6
被浏览
1,863

3 个回答

有的时候需要全局替换方法

最简单的例子就是把系统的bold字重改medium

还有jspatch等等应用

还有category里通过运行时“添加”属性

感谢楼上的回答。最近刚刚结束一个项目,也碰巧遇到了相关的实际应用,这里就强行自问自答一波。

由于我负责的项目需要支持到iOS7,而众所周知,目前主流应用都是运行在iOS9+环境以下,因此,编码时不得不考虑到系统兼容性的问题。然而题主首次面对多系统适配,缺乏相关经验,所以也就没有考虑到:某些新出来的方法仅支持iOS8+or9+or10+系统,而在iOS7系统下无法使用。

这也就造成了一个问题——使用搭载iOS7的机型跑项目的时候,莫名地会崩溃。而调试发现,崩溃的原因正式那个经典的"Unrecognized selector send to instance ********”

首先想到的解决方案就是,将出现这些问题的地方统统替换成旧的、低版本系统能够支持的方法。然而项目异常庞大,光是替换都得花费一个小时。非常不划算。

这时候,消息转发就闪亮登场了!

我们只需要通过全局断点,定位到低系统不能响应的方法。将方法名提取出来,在resolveInstanceMethod方法中拦截该方法名,并将它的实现指派给另一个方法,即可。

这样,就做到了,高版本系统响应高版本方法,低版本系统执行低版本方法的目的。省时省事!