Эквивалент 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");
Другие вопросы по тегам