如何拦截对id <protocol>对象的调用?

时间:2017-05-20 13:19:32

标签: objective-c objective-c-runtime

我将我的代码链接到框架,该框架返回到id<protocol>类型的app对象。但是,我不知道他们是什么课。 有没有办法可以拦截发送到我的程序中的那些对象的消息,也许有选择地,例如,我想拦截消息A而不是消息B。 我考虑过使用method_exchangeImplementations,但这似乎对我没有帮助,因为它需要了解课程并且我不知道。

1 个答案:

答案 0 :(得分:1)

id<protocol>完全意味着,除了响应协议中的@required方法之外,没有任何关于此对象的保证>

依赖于等式id部分的自定义行为,可以保证产生易碎,难以维护的代码库。每次框架转动时,您都必须对成功案例和失败案例进行完全限定通过,以确保您对该框架行为的解释仍然正确。如果你没有这个框架的源代码,那么你就可以进行一大堆黑盒子的调查。

所以,不要这样做。除非您正在编写测试工具或进行一些高级调试。它非常有用。

如果你想去那里,@ simple_code提到了Aspects库,这是一个很好的起点。由于您不知道将要接收的内容的类型,您可能需要使用isKindOfClass:进行某种类型的消歧,但是,再次沿着这条道路向您展示越来越多的内容依赖框架的实现细节(不仅仅是界面)不会改变。