在Objective C / iOS中相当于Ruby method_missing

时间:2012-03-21 07:31:10

标签: iphone objective-c ios

据我所知,Objective C / iOS是非常动态的语言,它是否像Ruby一样动态?它是否具有method_missing的等价物?我对js Does Javascript have something like Ruby's method_missing feature?提出了同样的问题,并对js不支持它感到失望。

3 个答案:

答案 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)

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

享受!

答案 2 :(得分:-1)

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

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