2011-12-16 17 views
9

Quiero hacer algo un poco hacky.Es posible capturar todas las llamadas al selector y redirigirlas en tiempo de ejecución

Cuando tratamos de llamar a un método en una clase que no está definida, generalmente obtenemos un error, p.

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

Quiero añadir algo a la MyClass que atrapa todas estas llamadas a métodos definidos y se ocupa de él. es posible?

Quiero algo como esto, pero que interceptará todas las llamadas a métodos:

@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 

Respuesta

11

¿Por qué no reemplaza el método doesNotRecognizeSelector: en NSObject (suponiendo que está heredando de él, que debería ser)?

+0

Perfecto. Esto es lo que estaba buscando, sabía que habría una manera. – Robert

+0

@paulbailey Tuviste suerte, 2 minutos después de mí con exactamente la misma respuesta y tu respuesta fue aceptada :) – Sulthan

+0

Todo sobre los enlaces ... ;-) – paulbailey

0

Creo que se puede tratar de hacer una nueva categoría de "NSObject" y sustituir dicho método específico de esa manera. De todos modos, tenga en cuenta que Apple recomienda no utilizar categorías para sobrescribir métodos, sino para agregar nuevas funcionalidades, por lo que es un poco hackish. Sin embargo, no estoy seguro de que se deshaga de la advertencia ...

7

Método de anulación: -[MyClass doesNotRecognizeSelector:] y llame al que desee.

Esto es lo que NSManagedObject está haciendo para obtener/establecer propiedades de datos de núcleo.

1

No estoy seguro de si está intentando interceptar mensajes enviados a una clase o a una instancia de una clase. En cualquier caso, quizás mirando/buscando en los temas de 'reenvío de mensajes' y 'reenvío de mensajes'. También vea forwardInvocation de NSObject y la sección de la guía pgmg tiempo de ejecución de Apple en el reenvío de mensajes http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html

Estos me llevaron a la respuesta que estaba buscando y yo no los vi mencionados en otra parte en esta cuestión.

+0

Creo que esto funciona mejor que la solución aceptada. – huggie

Cuestiones relacionadas