我最近开始了一个项目,需要进行swizzling。
在经历了许多教程之后,我得到了一个问题,实现和函数指针之间的区别是什么?
在内存中,IMP是一个内存地址,就像函数指针一样,可以像普通的C函数一样调用。然而,它保证使用objective-C消息传递约定,其中:
- 第一个参数是要操作的对象(self)
- 第二个参数是要调用的
_cmd
(SELECTOR)。我相信这是为了支持动态特性,例如ObjC消息转发,在这里我们可以将原始实现封装在代理中,比如启动事务或执行安全检查,或者,对于Cocoa特定的示例,在运行时通过魔术添加一些属性观察cruft。虽然我们已经有了函数签名,但在某些情况下,我可以通过消息签名来了解"我是如何到达这里的?" - 以下论点(如果有的话)根据方法合同