2009-07-05 11 views
7

ich eine Methode Dispatch-Tabelle einrichten möchten, und ich frage mich, ob es möglich ist, Zeiger auf ein Verfahren in Objective-C zu erzeugen (wie Zeiger in C funktionieren). Ich habe versucht, einige Objective-C-Laufzeitfunktionen zu verwenden, um Methoden dynamisch zu wechseln, aber das Problem wird alle Instanzen betreffen.Für Objective-C ... Zeiger auf Verfahren

Wie ich bin sehr neu in Objective-C, ein illustriertes Beispiel sehr geschätzt würde.

Antwort

16

Objective-C-Methoden heißen selector s und werden vom SEL-Datentyp dargestellt. Wenn Ihr Objekt von NSObject erbt, können Sie es sagen, einen Selektor (dh rufen eine Methode) wie so auszuführen:

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

Dies vorausgesetzt, dass Sie eine Methode definiert haben, wie:

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

Selektoren sind zugewiesen zu SEL Datatypes über das Schlüsselwort @selector, die den Namen der Methode nimmt, die Sie behalten möchten. Der Name der Methode ist der Methodenname, der von allen Argumenten entfernt wurde. Zum Beispiel:

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

Würde als @selector(doSomething:withParams:) referenziert werden.

+0

Oh, richtig! Jason, vielen Dank! –

5

Ja! In Objective-C werden Funktionszeiger als Selektoren bezeichnet. Wenn Sie eine Methode wie folgt definiert sind:

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

Der Wähler wie folgt erklärt:

@selector(myFunctionWithObject:otherObject:) 

Um einen Selektor auf einem Objekt durchführen, können Sie verwenden:

[object performSelector:@selector(myFunction)]; 

oder

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

Die se Der Lektor-Datentyp ist besonders nützlich für Threads und Timer, wo Sie einen Thread senden und ihm einen Selektor für die Nachricht bereitstellen können, die er aufrufen soll. Wenn Sie ein Array von Selektoren (oder eine Dispatch-Tabelle) erstellen müssen oder Selektoren mit mehreren Parametern aufrufen müssen, können Sie die NSInvocation-Klasse verwenden. Es bietet einen Wrapper für einen Selektor und ermöglicht es Ihnen, tatsächliche Argumente anzugeben.

Sie sollten bedenken, dass Objective-C bereits auf einer voll dynamischen Methode Dispatch-Tabelle basiert. Es hört sich so an, als ob die Pflege von Funktionszeigern mithilfe von Selektoren gut funktioniert, wenn Sie nur einen Verweis auf eine Funktion benötigen.

+0

Sie können den zweiten Satz ändern, um zu lesen: Wenn Sie eine Methode wie diese definiert haben. – micmoo

+0

Vielen Dank, Ben. Ja, Sie haben absolut Recht, dass die Laufzeit selbst eine voll dynamische Patch-Tabelle ist. –

Verwandte Themen