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:
Warum nicht einfach:
%Vor%Bitte erläutern Sie die Notwendigkeit und den Grund, und was passiert ohne sie.
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.
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.
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%Tags und Links objective-c selector