Was ist der Unterschied zwischen einer Methode und einem Selektor?


Antworten:


141

Das ist eine gute Frage.

  • Selektor - Ein Selektor ist der Name einer Methode. Sie sind sehr vertraut mit diesen Selektoren: alloc, init, release, dictionaryWithObjectsAndKeys:, setObject:forKey:, usw. Beachten Sie, dass der Darm Teil des Wählers ist; Auf diese Weise stellen wir fest, dass für diese Methode Parameter erforderlich sind. Auch (obwohl es äußerst selten ist) können Sie Selektoren wie diese haben : doFoo:::. Dies ist eine Methode, die drei Parameter akzeptiert und die Sie wie folgt aufrufen würden [someObject doFoo:arg1 :arg2 :arg3]. Es ist nicht erforderlich, dass vor jedem Teil der Auswahlkomponenten Buchstaben stehen. Wie gesagt, dies ist äußerst selten und wird in den Cocoa-Frameworks nicht verwendet. Sie können mit Selektoren direkt in Cocoa arbeiten. Sie haben den Typ SEL: SEL aSelector = @selector(doSomething:)oderSEL aSelector = NSSelectorFromString(@"doSomething:");

  • Nachricht - Eine Nachricht ist ein Selektor und die Argumente, die Sie damit senden. Wenn ich sage [dictionary setObject:obj forKey:key], dann ist die "Nachricht" der Selektor setObject:forKey:plus die Argumente objund key. Nachrichten können NSInvocationfür einen späteren Aufruf in ein Objekt eingekapselt werden . Nachrichten werden an einen Empfänger gesendet . (dh das Objekt, das die Nachricht "empfängt").

  • Methode - Eine Methode ist eine Kombination aus einem Selektor und einer Implementierung (und zugehörigen Metadaten). Die "Implementierung" ist der eigentliche Codeblock; Es ist ein Funktionszeiger (an IMP). Eine tatsächliche Methode kann intern mithilfe einer MethodStruktur abgerufen werden (abrufbar aus der Laufzeit).


Einige andere verwandte Dinge, nach denen Sie nicht gefragt haben:

  • Methodensignatur - Eine Methodensignatur repräsentiert die Datentypen, die von einer Methode zurückgegeben und von dieser akzeptiert werden. Sie können zur Laufzeit über ein NSMethodSignatureund (in einigen Fällen) ein Raw dargestellt werden char*.

  • Implementierung - der tatsächlich ausführbare Code einer Methode. Sein Typ zur Laufzeit ist ein IMP, und es ist wirklich nur ein Funktionszeiger. iOS 4.3 bietet eine neue Möglichkeit, einen Block in einen zu verwandeln IMP. Das ist wirklich cool .

Es macht Spaß zu erkennen, dass sich der Name einer Methode (der Selektor) von der Implementierung der Methode (IMP) unterscheidet. Dies bedeutet, dass Sie sie austauschen können, wenn Sie sich trauen. Sie können Methoden auch zur Laufzeit hinzufügen und entfernen, da Sie lediglich einen Eintrag in einer Hash-Tabelle bearbeiten: Der Schlüssel ist der Selektor und der Wert ist der IMPder Methode. Dies ermöglicht es Ihnen, einige wirklich verrückte und trippige Sachen zu machen. Es ist nichts für schwache Nerven. :) :)


Dies ist eine großartige Antwort: D 1. Der Selektor ähnelt also eher der Signatur / dem Pfad zur Methode selbst? Lassen Sie den Compiler wissen, wie Sie es finden? 2. Ich gehe davon aus, dass dies effizienter ist als das Übergeben der Methode selbst. Richtig? 3. Da jeder Selektor und jede Methode eine 1: 1-Beziehung hat und aufgrund dieser Effizienz die Methode nicht bestanden wird. 4. Können Sie auch ein dummes Beispiel dafür geben ? Sie können auch Methoden zur Laufzeit hinzufügen und entfernen, von denen ich immer gehört habe, aber ich habe es nie nötig gehabt oder gesehen, glaube ich .
Honig

5a. Kann ich einen bedingten Parameter übergeben, der zwischen Selektoren wechselt? 5b. anstatt einen bedingten Parameter an den Selektor zu übergeben ... warum nicht einfach eine Methode mit einer ifAnweisung erstellen ? Ich denke, es liegt daran, dass ifunsere Methoden ohne das s zu einer reineren Methode werden, die das tut, was sie gesagt haben. Die Schlussfolgerung, dass die "Zustandsbehandlung" und die "Aktion", die sich darum dreht, nicht auf dieselbe Weise erfolgen sollten.
Honig

9

Eine Methode ist die Implementierung, die ausgeführt wird, wenn ein Objekt oder eine Klasse aufgefordert wird, eine Aktion auszuführen. Es liegt im Umfang seiner enthaltenden Klasse und unterscheidet sich daher, wenn auf eine andere Klasse verwiesen wird. Ein Selektor ist ein Bezeichner, der den Namen einer Methode darstellt. Es ist nicht auf eine bestimmte Klasse oder Methode bezogen und kann verwendet werden, um eine Methode einer Klasse zu beschreiben, unabhängig davon, ob es sich um eine Klassen- oder Instanzmethode handelt.

Ein Selektor ist einfach wie ein Schlüssel in einem Wörterbuch. Es kann Ihnen sagen, über welche Methode jemand spricht, aber nur, wenn Sie auch das Wörterbuch selbst haben (die Klasse oder das Objekt). Die Methode erhalten Sie, wenn Sie mit dem Selektor als Schlüssel nach dem Wert aus dem Wörterbuch fragen.


1

Diese Site bietet einen guten Überblick über alle fraglichen Begriffe: http://www.otierney.net/objective-c.html

Schauen Sie sich den Link an, aber ich werde eine kurze Zusammenfassung geben:

Eine Methode ähnelt im Wesentlichen einer Funktionsmethode, die Sie in Ihrer bevorzugten Programmiersprache gewohnt sind.

Eine Nachricht (aus dem Artikel) "Eine Nachricht kann dynamisch an ein anderes Objekt weitergeleitet werden. Das Aufrufen einer Nachricht für ein Objekt in Objective-C bedeutet nicht, dass das Objekt diese Nachricht implementiert, sondern nur, dass es irgendwie darüber reagieren kann direkte Implementierung oder Weiterleitung der Nachricht an ein Objekt, das weiß, wie es geht. "

Selektoren können zwei Dinge bedeuten. Es kann sich auf den Namen einer Methode beziehen oder "bezieht sich auf die eindeutige Kennung, die den Namen ersetzt, wenn der Quellcode kompiliert wird. Kompilierte Selektoren sind vom Typ SEL." (von: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html )

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.