2009-07-05 8 views
7

Desidero impostare una tabella di invio del metodo e mi chiedo se sia possibile creare un puntatore a un metodo in Objective-C (come il puntatore alla funzione in C). Ho provato a utilizzare alcune funzioni di runtime Objective-C per passare dinamicamente ai metodi, ma il problema è che interesserà tutte le istanze.Per Objective-C ... Puntatore al metodo

Dato che sono molto nuovo per Objective-C, un esempio illustrato sarebbe molto apprezzato.

risposta

16

I metodi Objective-C sono chiamati selector s e sono rappresentati dal tipo di dati SEL. Se il vostro oggetto eredita da NSObject, si può dire che per eseguire un selettore (ad esempio chiamare un metodo), come così:

SEL selector = @selector(doSomething:); 
[obj performSelector:selector withObject:argument]; 

Questo presuppone che un metodo definito come:

-(void)doSomething:(MyObject*)arg; 

selettori sono assegnato ai tipi di dati SEL tramite la parola chiave @selector, che prende il nome del metodo che si desidera conservare. Il nome del metodo è il nome del metodo rimosso da tutti gli argomenti. Per esempio:

-(void)doSomething:(MyObject*)arg withParams:(MyParams*)params 

sarebbe fatto riferimento come @selector(doSomething:withParams:).

+0

Oh, giusto! Jason, grazie mille! –

5

Sì! In Objective-C, i puntatori di funzione sono chiamati selettori. Se è stato un metodo definito in questo modo:

- (void)myFunctionWithObject:(NSObject*)obj otherObject:(NSNumber*)obj2 
{ 
} 

Il selettore è dichiarato così:

@selector(myFunctionWithObject:otherObject:) 

Per eseguire un selettore su un oggetto, è possibile utilizzare:

[object performSelector:@selector(myFunction)]; 

o

[object performSelector:@selector(myFunctionTakingParameter:) withObject: o]; 

Il se Il tipo di dati del lettore è particolarmente utile per thread e timer, in cui è possibile inviare un thread e fornire un selettore al messaggio che si desidera richiamare. Se è necessario creare una serie di selettori (o una tabella di distribuzione) o se è necessario richiamare selettori con più parametri, è possibile utilizzare la classe NSInvocation. Fornisce un wrapper per un selettore e consente di specificare argomenti reali.

Si tenga presente che Objective-C è già basato su una tabella di invio del metodo completamente dinamica. Sembra che mantenere i puntatori di funzione usando i selettori funzionerà bene per te se hai solo bisogno di un riferimento a una funzione, però.

+0

Potrebbe essere necessario modificare la seconda frase da leggere: Se si dispone di un METODO definito in questo modo. – micmoo

+0

Grazie mille, Ben. Sì, hai assolutamente ragione che il runtime è esso stesso una tabella di patch completamente dinamica. –

Problemi correlati