2010-03-02 10 views
6

Ho una classe che utilizza resolveInstanceMethod per implementare i metodi in modo dinamico. Quando chiamo i metodi implementati dinamicamente da altre parti del codice, il compilatore emette un avviso che l'oggetto potrebbe non rispondere al selettore. Vorrei che il compilatore non emettesse tali avvertimenti per questa classe, ma non voglio sopprimere gli avvertimenti quando invoco un selettore non valido su altre classi. È possibile?Come posso dire al compilatore che la mia classe risolve i metodi in modo dinamico?

risposta

7

Supponendo che conoscete le firme dei metodi che saranno risolti in modo dinamico in fase di compilazione, è possibile dichiarare 'em in una categoria informale:

@interface MyDynamicallyResolvingClass(MethodsThatWillResolveAtRuntime) 
... declare the methods here ... 
@end 

Non c'è bisogno di fornire un'implementazione.

Se non si conoscono le firme - se anche i nomi dei metodi sono dinamici - allora è necessario utilizzare sia -performSelector: (o le varianti di argomento oggetto singolo o doppio) o è probabile che si desideri utilizzare NSInvocazione, a meno che la prestazione non sia una preoccupazione importante (se lo è, esistono soluzioni alternative che sono significativamente più laboriose).

+0

Un protocollo informale risolve perfettamente il mio problema. –

4

Usa performSelector:

E 'equivalente ad inviare un messaggio direttamente al ricevitore, tuttavia, consente di inviare messaggi che non sono determinati fino al runtime.

Se i metodi di prendere uno o due argomenti, è possibile utilizzare le sorelle di questo metodo: – performSelector:withObject: e – performSelector:withObject:withObject:

Se i metodi hanno più di due argomenti, o argomenti che non sono di tipo di oggetto, questa risposta è non adattato.

+0

Che funziona solo per i metodi che richiedono argomenti di tipo di oggetto 0, 1 o 2. – bbum

+0

Infatti. Modificato la risposta per chiarire questa limitazione. – Guillaume

Problemi correlati