NSProxy vs NSObject

Jas*_*ues 19 objective-c objective-c-runtime

我正在使用方法调配来在一个具有一些额外功能的类中包装所有方法调用.具体来说我是:

  • 检查此方法调用所需的对象是否在缓存中
  • 如果缓存有该对象返回它.
  • 如果没有,则调度到原始实现,填充缓存并返回该缓存.

对于每种方法,我都会重新路由到一个建议的方法.并使用+(BOOL)resolveInstanceMethod:(SEL)sel和IMP_implementationWithBlock实现新方法.

它工作正常,但代码没有很好地阅读.似乎NSProxy将提供一种更简洁的方式来实现此功能.

但还有另一种选择,就是简单地在我的目标对象的方法周围使用NSObject子类替换和拦截方法.通过重写forwardInvocation和methodSignatureForSelector,我可以获得所需的结果.

那么NSProxy给我的是什么?我为什么要用这个呢?

Ken*_*ses 14

关键NSProxy是它没有实现大多数方法.这是必要的,以确保开始调用Objective-C转发机制.如果你开始NSObject,有很多方法只是直接发送,你没有机会转发它们.

  • 首先,`-methodSignatureForSelector:`不确定调用哪个实现的任何内容.它只描述了有关方法签名的元数据 - 其参数计数,类型和返回类型.其次,它不是在"正常"消息调度中调用的.它仅在正常方法查找失败时调用,`+ resolveInstanceMethod:`没有添加方法,`-forwardingTargetForSelector:`不返回有效目标.这是我的全部观点.如果已经在对象的类上实现了该方法,则不会调用转发机制. (5认同)
  • 你可以说得更详细点吗?在什么情况下?我已经实现了代理,无论我是否扩展NSProxy都可以. (2认同)
  • 我发现这也很有帮助.http://stackoverflow.com/questions/4574465/objective-c-respondstoselector-question/4574563#4574563 (2认同)