Per Objective-C ... Puntatore metodo
-
23-08-2019 - |
Domanda
Voglio installare un tavolo Metodo spedizione e mi chiedo se è possibile creare puntatore a un metodo in Objective-C (come puntatore a funzione in C). Ho cercato di usare alcune funzioni Objective-C di runtime per passare in modo dinamico i metodi ma il problema è che interesserà tutte le istanze.
Sono molto nuovo per Objective-C, un esempio illustrato sarebbe molto apprezzato.
Soluzione
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 (vale a dire chiamare un metodo), come in tal modo:
SEL selector = @selector(doSomething:);
[obj performSelector:selector withObject:argument];
Questo presuppone che un metodo definito come:
-(void)doSomething:(MyObject*)arg;
I selettori sono assegnati a SEL
tipi di dati attraverso la parola @selector
, che prende il nome del metodo che si desidera conservare. Il nome del metodo è il nome del metodo spogliato di tutti gli argomenti. Ad esempio:
-(void)doSomething:(MyObject*)arg withParams:(MyParams*)params
dovrebbe essere indicata come @selector(doSomething:withParams:)
.
Altri suggerimenti
Sì! In Objective-C, i puntatori a funzione sono chiamati selettori. Se è stato un metodo definito in questo modo:
- (void)myFunctionWithObject:(NSObject*)obj otherObject:(NSNumber*)obj2
{
}
Il selettore è dichiarato in questo modo:
@selector(myFunctionWithObject:otherObject:)
Per eseguire un selettore su un oggetto, è possibile utilizzare:
[object performSelector:@selector(myFunction)];
o
[object performSelector:@selector(myFunctionTakingParameter:) withObject: o];
Il tipo di dati di selezione è particolarmente utile per le discussioni e timer, in cui è possibile inviare un filo e fornire un selettore per il messaggio che vuoi a invocare. Se è necessario creare una matrice di selettori (o una tabella della spedizione), o se avete bisogno di invocare selettori con più parametri, è possibile utilizzare la classe NSInvocation. Esso fornisce un wrapper per un selettore e consente di specificare gli argomenti attuali.
Si dovrebbe tenere a mente che Objective-C si basa già su un tavolo metodo di spedizione completamente dinamico. Suona come il mantenimento di puntatori a funzione utilizzando i selettori funzionerà bene per voi se avete solo bisogno di un riferimento a una funzione, però.