2011-12-16 14 views
9

Voglio fare qualcosa di un po 'hacky.È possibile catturare tutte le chiamate di selezione e reindirizzarle in fase di esecuzione

Quando proviamo a chiamare un metodo su una classe in cui non è definito, di solito riceviamo un errore, ad es.

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

Voglio aggiungere qualcosa in MyClass che cattura tutte queste chiamate e offerte di metodo non definiti con esso. È possibile?

voglio qualcosa di simile, ma che intercetterà tutto il metodo chiamate:

@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 

risposta

11

Perché non limitarsi a sostituire il metodo doesNotRecognizeSelector: su NSObject (presumendo che si stia ereditando da esso, quale dovrebbe essere)?

+0

Perfetto. Questo è quello che stavo cercando, sapevo che ci sarebbe stato un modo. – Robert

+0

@paulbailey Sei stato fortunato, 2 minuti dopo di me con esattamente la stessa risposta e la tua risposta è stata accettata :) – Sulthan

+0

Tutto sui collegamenti ... ;-) – paulbailey

0

Credo che si può provare a fare una nuova categoria per "NSObject" e sovrascrivere il metodo specifico del genere. Ad ogni modo, tieni presente che Apple consiglia di non utilizzare categorie per sovrascrivere i metodi, ma di aggiungere nuove funzionalità, quindi è un po 'hacker. Tuttavia, non sono sicuro che eliminerai l'avviso ...

7

Metodo di override: -[MyClass doesNotRecognizeSelector:] e chiamare quello che vuoi.

Questo è ciò che sta facendo NSManagedObject per ottenere/impostare le proprietà dei dati di base.

1

Non sono chiaro se si stia tentando di intercettare i messaggi inviati a una classe o a un'istanza di una classe. In ogni caso, forse esaminando/cercando gli argomenti di "inoltro di messaggi" e "inoltro di messaggi". Si veda anche forwardInvocation di NSObject e la sezione di guida pgmg runtime di Apple su inoltro dei messaggi http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html

Questi mi ha fatto la risposta che cercavo e non ho visto li menzionate altrove su questa questione.

+0

Penso che funzioni meglio della soluzione accettata. – huggie

Problemi correlati