Was ist der Unterschied zwischen einer Methode, einem Selektor und einer Nachricht in Objective-C?
Was ist der Unterschied zwischen einer Methode, einem Selektor und einer Nachricht in Objective-C?
Antworten:
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 obj
und key
. Nachrichten können NSInvocation
fü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 Method
Struktur 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 NSMethodSignature
und (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 IMP
der Methode. Dies ermöglicht es Ihnen, einige wirklich verrückte und trippige Sachen zu machen. Es ist nichts für schwache Nerven. :) :)
if
Anweisung erstellen ? Ich denke, es liegt daran, dass if
unsere 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.
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.
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 )