据我所知,Objective C / iOS是非常动态的语言,它是否像Ruby一样动态?它是否具有method_missing的等价物?我对js Does Javascript have something like Ruby's method_missing feature?提出了同样的问题,并对js不支持它感到失望。
答案 0 :(得分:17)
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
答案 1 :(得分:0)
我已根据向UITextField
和UITextView
子类添加相同方法的示例实现此模式:https://stackoverflow.com/a/19661059/171933
享受!
答案 2 :(得分:-1)
我猜method_missing是一个回调方法,当对象缺少某个方法时会调用该方法。好吧,您可以使用respondsToSelector方法来检查对象是否可以响应方法。这是在NSObject协议中声明的方法。因此,在意识到缺少某些方法之后,不要调用method_missing,而是可以在之前检查它。
if ([myObject respondsToSelector:@selector(someMethodThatMightBeMissing:)])
NSLog(@"The method is missing");