Можно ли перехватить все вызовы селектора и перенаправить их во время выполнения - PullRequest
9 голосов
/ 16 декабря 2011

Я хочу сделать что-нибудь немного хакерское.

Когда мы пытаемся вызвать метод для класса, который не определен, мы обычно получаем ошибку, например

// We get a undefined selector callback
[myClass someUndefinedMethod];

Iхочу добавить в MyClass что-то, что перехватывает все эти неопределенные вызовы методов и обрабатывает их.Возможно ли это?

Я хочу что-то подобное, но которое будет перехватывать все вызовы методов:

@implementation MyClass

    - (void) performSelector(SEL):selector {

          // Check if the method exists
          if (![self respondsToSelector:selector]) {
              // Handle unimplemeted selector
              NSLog(@"No method called %@", selector);
          } 

          // Otherwise proced as normal
          else {
              [super performSelector:selector];
          }
    }

@end

Ответы [ 4 ]

11 голосов
/ 16 декабря 2011

Почему бы просто не переопределить метод doesNotRecognizeSelector: в NSObject (при условии, что вы наследуете от него, каким вы должны быть)?

7 голосов
/ 16 декабря 2011

Переопределите метод: -[MyClass doesNotRecognizeSelector:] и вызывайте все, что вы хотите.

Это то, что NSManagedObject делает для получения / установки свойств основных данных.

1 голос
/ 18 января 2012

Мне неясно, пытаетесь ли вы перехватить сообщения, отправленные классу или экземпляру класса. В любом случае, возможно, изучите темы «пересылка сообщений» и «пересылка сообщений». Также см. ForwardInvocation NSObject и раздел руководства pgmg по времени выполнения Apple по пересылке сообщений. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html

Это дало мне ответ, который я искал, и я не видел, чтобы они упоминались где-либо еще по этому вопросу.

0 голосов
/ 16 декабря 2011

Полагаю, вы можете попытаться создать новую категорию для "NSObject" и переписать этот конкретный метод таким образом. В любом случае, имейте в виду, что Apple рекомендует не использовать категории для перезаписи методов, а добавлять новые функции, так что это немного хакерски. Однако я не уверен, что избавится от предупреждения ...

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