Эквивалент Ruby method_missing в Objective C / iOS
Насколько я понимаю, Objective C / iOS - очень динамичный язык, так ли он динамичен, как Ruby? У него есть эквивалент method_missing? Я задал тот же вопрос для js. Есть ли в Javascript что-то вроде метода method_missing в Ruby? и был разочарован тем, что JS пока не поддерживает его.
3 ответа
Objective-C динамичен, хотя, будучи программистом на Ruby, я бы сказал, что он не такой динамичный, как Ruby.
Objective-C имеет эквивалент метода method_missing. Вы хотите переопределить оба forwardInvocation:
а также methodSignatureForSelector:
и следуйте этому важному совету от Apple:
Важно! Чтобы ответить на методы, которые ваш объект сам не распознает, вы должны переопределить methodSignatureForSelector: в дополнение к forwardInvocation:. Механизм пересылки сообщений использует информацию, полученную из метода 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
подкласс: /questions/30315941/mixins-ili-mnozhestvennoe-nasledovanie-v-objective-c/30315951#30315951
Наслаждайтесь!
Я предполагаю, что method_missing - это метод обратного вызова, который вызывается, когда объект пропускает определенный метод. Ну, вы можете использовать метод RespondsToSelector, чтобы проверить, может ли объект ответить на метод. Это метод, объявленный в протоколе NSObject. Таким образом, вместо вызова метода method_missing после осознания того, что какой-то метод отсутствует, вы можете проверить его заранее.
if ([myObject respondsToSelector:@selector(someMethodThatMightBeMissing:)])
NSLog(@"The method is missing");