【问题标题】:Equivalent of Ruby method_missing in Objective C / iOSObjective C / iOS 中 Ruby method_missing 的等价物
【发布时间】:2012-04-05 17:11:42
【问题描述】:

据我了解,Objective C / iOS 是非常动态的语言,那么它和 Ruby 一样动态吗?它是否具有等效于 method_missing 的功能?我对 js Does Javascript have something like Ruby's method_missing feature? 提出了同样的问题,对 js 还不支持它感到失望。

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    Objective-C 是动态的,虽然我是一名 Ruby 程序员,但我会说它不像 Ruby 那样动态。

    Objective-C 确实有 method_missing 的等价物。您需要同时覆盖 forwardInvocation:methodSignatureForSelector: 并遵循 Apple 的以下重要建议:

    重要要响应对象本身无法识别的方法,除了 forwardInvocation: 之外,您还必须重写 methodSignatureForSelector:。转发消息的机制使用从 methodSignatureForSelector: 获得的信息来创建要转发的 NSInvocation 对象。您的覆盖方法必须为给定的选择器提供适当的方法签名,方法是预先制定一个或通过向另一个对象询问一个。

    不要使用 doesNotRecognizeSelector:,因为 Apple 会警告 it must always result in an exception being thrown.

    请参阅 NSObject 类文档了解更多详细信息:http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

    【讨论】:

    【解决方案2】:

    我已经根据向UITextFieldUITextView 子类添加相同方法的示例实现了这种模式:https://stackoverflow.com/a/19661059/171933

    享受吧!

    【讨论】:

      【解决方案3】:

      我猜 method_missing 是一个回调方法,当对象缺少某个方法时会调用它。好吧,您可以使用 respondsToSelector 方法来检查对象是否可以响应方法。它是在 NSObject 协议中声明的方法。因此,您可以事先检查它,而不是在意识到缺少某些方法后调用 method_missing。

       if ([myObject respondsToSelector:@selector(someMethodThatMightBeMissing:)])
          NSLog(@"The method is missing");
      

      【讨论】:

      • respondsToSelector: 在 Objective-C 中对应于 Ruby 中的 respond_to?,而不是 method_missing
      • 你的似乎比 louielouie 简单有什么区别,因为我无法判断为新手谢谢 :)
      • 我建议的方法可以帮助您检查对象是否可以响应方法。当您怀疑一个对象可能不响应某个方法时,您最想使用此方法,这是一种预防措施。如果一个对象或其前身没有这样的方法,你的程序就会崩溃。但是仅在对象响应它的条件下调用方法将防止您的程序崩溃。 method_missing方法据我了解是在这种情况发生时调用的方法,不会让你的程序崩溃。所以前者用于检查,后者用于处理案例。
      • 我认为@louielouie 的回答更准确、更恰当,因为他知道 Ruby,但我对此一无所知
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2021-08-09
      相关资源
      最近更新 更多