method swizzling 原理
在objective-c中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用objective-c的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。
每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。imp有点类似函数指针,指向具体的method实现。
我们可以利用 method_exchangeimplementations 来交换2个方法中的imp,
我们可以利用 class_replacemethod 来修改类,
我们可以利用 method_setimplementation 来直接设置某个方法的imp,
……
归根结底,都是偷换了selector的imp,如下图所示:
method swizzling 实践
举个例子好了,我想钩一下nsarray的lastobject 方法,只需两个步骤。
第一步:给nsarray加一个我自己的lastobject
复制代码 代码如下:
发表评论