Цель C и магические методы в классе - PullRequest
9 голосов
/ 04 августа 2011

Предоставляет ли target-c способ перехвата вызовов метода класса, который не существует?

Ответы [ 2 ]

5 голосов
/ 04 августа 2011

Метод forwardInvocation - это то, что вы хотите использовать.Он вызывается автоматически, когда к объекту вызывается несуществующий селектор.Поведение этого метода по умолчанию - вызывать doesNotRecognizeSelector: (именно это выводит отладочную информацию на вашу консоль), но вы можете переопределить его, делая все, что захотите.Один из рекомендуемых Apple подходов заключается в том, чтобы этот метод передавал вызов метода другому объекту.

- (void)forwardInvocation:(NSInvocation *)anInvocation

Обратите внимание, что forwardInvocation - довольно дорогая операция.Объект NSInvocation должен быть создан платформой и (необязательно) использован для вызова селектора в другом экземпляре.Если вы ищете (относительно) более быстрый метод обнаружения несуществующих селекторов, вы можете вместо этого реализовать forwardingTargetForSelector.

- (id)forwardingTargetForSelector:(SEL)aSelector

Вам следует Документация Apple , чтобы узнать, какДля эффективного переопределения этих методов есть некоторые ошибки, на которые следует обратить внимание, особенно при переопределении метода forwardInvocation для того же объекта, у которого будут отсутствующие селекторы.

2 голосов
/ 04 августа 2011

Да, вы можете с помощью метода resolClassMethod: class (который определен в NSObject):

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

Здесь также есть кое-что, на что следует обратить внимание (меня озадачило в первый раз): http://iphonedevelopment.blogspot.com/2008/08/dynamically-adding-class-objects.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...