Für was ist die @ selector-Direktive? Warum nicht einfach den Namen der Methode verwenden?

8

Ich habe viele Artikel gelesen, um zu verstehen, warum es notwendig ist, @selector() zu verwenden, um auf eine Methode zu verweisen, aber ich glaube nicht, dass ich zufrieden bin. Wenn wir beispielsweise eine Aktion für eine Schaltfläche angeben, müssen wir schreiben:

%Vor%

Warum nicht einfach:

%Vor%

Bitte erläutern Sie die Notwendigkeit und den Grund, und was passiert ohne sie.

    
RAIS IQBAL 25.05.2012, 16:03
quelle

4 Antworten

8
  

Ich habe viele Artikel gelesen, um das @ selector-Schlüsselwort zu verstehen   aber ich verstehe seinen Zweck immer noch nicht ganz. Ich möchte nur fragen   Warum haben wir @selector.

Es hat alles damit zu tun, die Sprache C zu analysieren.

Allein in einem Ausdruck wie [obj performSelector:someRandomSelector]' behandelt der Compiler someRandomSelector bit als "expand was auch immer someRandomSelector ist - Auswertung von Ausdrücken, Umgang mit #defines, Festlegung eines Symbols für spätere Verlinkung, etc .. - und was auch immer diese Erweiterung ergibt, sei ein SEL.

Wenn Sie also [obj performSelector:action]' schreiben, hat der Compiler keine Möglichkeit, den Unterschied zwischen action als Variable mit einem potenziell flüchtigen Selektor und action als tatsächlichen Namen einer Methode in obj zu kennen. .

@selector() löst das, indem es eine syntaktische Addition zu der Sprache erstellt, die immer zu einem konstanten SEL-Ergebnis führt.

In der Vergangenheit wurde Objective-C ursprünglich als direkte Erweiterung des C-Präprozessors implementiert. Alle verschiedenen @... vorangestellten Zusätze machten diese Implementierung viel einfacher, da grundsätzlich alles, was ein @ voraussetzte, ein Objective-Cism war.

    
bbum 25.05.2012, 16:41
quelle
1

Es ist eine Frage des Sprachdesigns. Sie müssen etwas sagen, das ist ein Selektor, und das ist die Syntax, mit der Sie den Text in der Quelldatei trennen, die den Selektor, über den Sie sprechen, und den Code dahinter beschreibt. Dies erfordert eine Art Zitat oder Klammer darum. @selector(...) ist nur die Syntax, mit der sie gegangen sind.

Was wäre, wenn Sie einen Selektor hätten, der : enthält, zum Beispiel thingWithX:y:z: ? Sie könnten [btn addTarget:self action:thingWithX:y:z:] nicht haben, da die Doppelpunkte den Compiler verwirren würden. Sie müssten [btn addTarget:self action:@selector(thingWithX:y:z:)] haben, um den Selektor des btn action: und den Selektor% ce_de% zu trennen.

    
Joe 25.05.2012 16:26
quelle
0

Hier ist die Dokumentation zu Selektoren:

Ссылка

Ich denke, Sie werden es nach dem Lesen verstehen.

    
woz 25.05.2012 16:19
quelle
0

Ihr Beispiel kann funktionieren, wenn myMethod eine SELECTOR-Instanz ist

%Vor%

Für die Zeichenfolge können Sie

verwenden %Vor%

hier erklärt Ссылка

Hier ist ein Beispiel für eine generische actionLinker-Funktion How to Programmgesteuert ein CallBacks für eine UIButton?

%Vor%

Wenn Sie Ihr eigenes Beispiel mit myMethod als Selektor-Instanz verwenden möchten, ist folgender Code anwendbar:

%Vor%     
zainengineer 21.06.2014 20:03
quelle

Tags und Links