【发布时间】: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
据我了解,Objective C / iOS 是非常动态的语言,那么它和 Ruby 一样动态吗?它是否具有等效于 method_missing 的功能?我对 js Does Javascript have something like Ruby's method_missing feature? 提出了同样的问题,对 js 还不支持它感到失望。
【问题讨论】:
标签: iphone objective-c ios
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
【讨论】:
我已经根据向UITextField 和UITextView 子类添加相同方法的示例实现了这种模式:https://stackoverflow.com/a/19661059/171933
享受吧!
【讨论】:
我猜 method_missing 是一个回调方法,当对象缺少某个方法时会调用它。好吧,您可以使用 respondsToSelector 方法来检查对象是否可以响应方法。它是在 NSObject 协议中声明的方法。因此,您可以事先检查它,而不是在意识到缺少某些方法后调用 method_missing。
if ([myObject respondsToSelector:@selector(someMethodThatMightBeMissing:)])
NSLog(@"The method is missing");
【讨论】:
respondsToSelector: 在 Objective-C 中对应于 Ruby 中的 respond_to?,而不是 method_missing。