Ich möchte eine Method-Dispatch-Tabelle einrichten und frage mich, ob es möglich ist, einen Zeiger auf eine Methode in Objective-C zu erstellen (wie der Zeiger auf die Funktion in C). Ich habe versucht, einige Objective-C-Laufzeitfunktionen zu verwenden, um Methoden dynamisch zu wechseln, aber das Problem ist, dass es alle Instanzen betrifft.
Da ich Objective-C sehr neu bin, würde ein illustriertes Beispiel sehr geschätzt werden.
Objective-C-Methoden heißen selector
s und werden vom Datentyp SEL
repräsentiert. Wenn Ihr Objekt von NSObject
erbt, können Sie es anweisen, einen Selektor (also eine Methode aufzurufen) wie folgt auszuführen:
Dies setzt voraus, dass Sie eine Methode definiert haben wie:
%Vor% Selektoren werden SEL
-Datentypen über das Schlüsselwort @selector
zugewiesen, das den Namen der Methode übernimmt, die Sie behalten möchten. Der Name der Methode ist der Methodenname, der von allen Argumenten entfernt wurde. Zum Beispiel:
Würde als @selector(doSomething:withParams:)
referenziert.
Ja! In Objective-C werden Funktionszeiger als Selektoren bezeichnet. Wenn Sie eine Methode wie folgt definiert haben:
%Vor%Der Selektor wird wie folgt deklariert:
%Vor%Um einen Selektor für ein Objekt auszuführen, können Sie Folgendes verwenden:
%Vor%oder
%Vor%Der Selektordatentyp 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 vollständig dynamischen Methodenabfertigungstabelle basiert. Es klingt so, als ob die Pflege von Funktionszeigern mithilfe von Selektoren gut funktioniert, wenn Sie nur einen Verweis auf eine Funktion benötigen.
Tags und Links objective-c dispatch methods pointers