【问题标题】:Objective C and magic methods in class课堂上的Objective C和魔术方法
【发布时间】:2011-10-19 20:05:56
【问题描述】:

objective-c 是否提供了一种方法来拦截对不存在的类方法的调用?

【问题讨论】:

    标签: objective-c method-missing


    【解决方案1】:

    forwardInvocation 方法是您要使用的方法。当在对象上调用不存在的选择器时会自动调用它。此方法的默认行为是调用doesNotRecognizeSelector:(这是向控制台输出调试信息的方式),但您可以覆盖它做任何您想做的事情。 Apple 推荐的一种方法是让此方法将方法调用转发给另一个对象。

    - (void)forwardInvocation:(NSInvocation *)anInvocation
    

    请注意,forwardInvocation 是一项相当昂贵的操作。 NSInvocation 对象需要由框架创建,并且(可选地)用于调用另一个实例上的选择器。如果您正在寻找一种(相对)更快的方法来检测不存在的选择器,那么您可以选择实现 forwardingTargetForSelector

    - (id)forwardingTargetForSelector:(SEL)aSelector
    

    您应该 Apple's documentation 了解如何有效地覆盖这些方法,需要注意一些问题,尤其是在将缺少选择器的同一对象上覆盖 forwardInvocation 方法时。

    【讨论】:

    • 类方法转发机制需要类方法,而不是实例方法。 +(void)forwardingTargetForSelector:(SEL)sel;+(void)forwardInvocation:(NSInvocation *)anInvocation;后面的函数使用了一个支持函数:+(NSMethodSignature *)methodSignatureForSelector:(SEL)sel;
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2011-06-10
      相关资源
      最近更新 更多