【问题标题】:NSProxy vs NSObjectNSProxy 与 NSObject
【发布时间】:2013-08-19 12:48:20
【问题描述】:

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

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

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

它运行良好,但代码读起来不太好。似乎 NSProxy 将提供一种更简洁的方式来实现此功能。

但还有另一种选择,就是简单地使用一个 NSObject 子类替代并拦截目标对象方法周围的方法调用。通过覆盖 forwardInvocation 和 methodSignatureForSelector,我可以获得所需的结果。

那么 NSProxy 给了我什么?我为什么要改用这个?

【问题讨论】:

    标签: objective-c objective-c-runtime


    【解决方案1】:

    NSProxy 的重点在于它没有实现大多数方法。这对于确保在开始时调用 Objective-C 转发机制是必要的。如果你以NSObject开头,有很多方法会直接发送,你没有机会转发。

    【讨论】:

    • 你能说得更具体点吗?在什么情况下?我已经实现了一个代理,无论我是否扩展 NSProxy,它都可以工作。
    • NSObject的界面。任何在NSProxy 中定义且未被代理类覆盖的方法都不会被转发。一定要考虑NSObject 上的所有类别(那些有实现的,而不是非正式协议的)。一个例子可能是-classForCoder 和朋友。如果您尝试归档包裹在代理类中的 NSString,会发生什么情况?
    • 没有。首先,-methodSignatureForSelector: 无法确定调用哪个实现。它只是描述了有关方法签名的元数据——它的参数计数、类型和返回类型。其次,它不会在“正常”消息分发中调用。只有在正常的方法查找失败、+resolveInstanceMethod: 没有添加方法、-forwardingTargetForSelector: 没有返回有效目标时才会调用它。这就是我的全部观点。如果对象的类上已经有该方法的实现,则不会调用转发机制。
    • 好的,现在知道了。谢谢。
    • 我觉得这也很有帮助。 stackoverflow.com/questions/4574465/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多