Frage

Erstens, ich bin nicht sicher, ob ich wirklich verstehen, was ein Selektor ist. Von meinem Verständnis ist es der Name einer Methode, und man kann es auf eine Klasse des Typs ‚SEL‘ zuweisen und dann wie respondToSelector laufen Methoden, um zu sehen, ob der Empfänger diese Methode implementiert. Kann jemand eine bessere Erklärung darbringen?

Zweitens, zu diesem Punkt habe ich den folgenden Code:

NSString *thing = @"Hello, this is Craig";

SEL sel = @selector(lowercaseString:);
NSString *lower = (([thing respondsToSelector:sel]) ? @"YES" : @"NO");
NSLog (@"Responds to lowercaseString: %@", lower);
if ([thing respondsToSelector:sel]) //(lower == @"YES")
    NSLog(@"lowercaseString is: %@", [thing lowercaseString]);

Doch obwohl thing ist eindeutig eine Art von NSString und zu lowercaseString reagieren soll, kann ich nicht die ‚respondsToSelector‘ get bedingten „YES“ zurückzukehren ...

War es hilfreich?

Lösung

Sie müssen sehr vorsichtig über die Methodennamen sein. In diesem Fall ist der Methodenname nur „lowercaseString“, nicht „lowercaseString:“ (man beachte das Fehlen des Dickdarms). Deshalb Sie bekommen NO zurückgegeben, weil NSString Objekte in der lowercaseString Nachricht antworten, aber nicht die lowercaseString: Nachricht.

Wie wissen Sie, wenn Sie einen Doppelpunkt hinzufügen? Sie fügen einen Doppelpunkt an die Nachricht Namen, wenn Sie einen Doppelpunkt hinzufügen würde, wenn er ruft, was passiert, wenn es ein Argument. Wenn es null Argumente übernimmt (wie es der Fall mit lowercaseString ist), dann gibt es keinen Doppelpunkt. Wenn es mehr als ein Argument nimmt, müssen Sie zusammen mit ihren Doppelpunkten der zusätzlichen Argumentnamen hinzufügen, wie in compare:options:range:locale:.

Sie können auch auf der Dokumentation und beachten Sie die Anwesenheit oder Abwesenheit eines Hinterdoppelpunkt.

Andere Tipps

Selektoren sind eine effiziente Art und Weise Methoden direkt in kompilierten Code zu verweisen -. der Compiler ist das, was tatsächlich den Wert auf einen SEL zugewiesen

Andere abgedeckt haben bereits den zweiten Teil Ihrer q, die ‚:‘ am Ende eine andere Signatur übereinstimmt als das, was Sie suchen (in diesem Fall, dass die Unterzeichnung nicht existiert).

Das ist, weil Sie @selector(lowercaseString) wollen, nicht @selector(lowercaseString:). Es gibt einen feinen Unterschied:. Der zweite einen Parameter impliziert (man beachte den Doppelpunkt am Ende), aber - [NSString lowercaseString] muss kein Parameter

In diesem Fall ist der Name des Wählers falsch. Der Doppelpunkt hier ist Teil der Methodensignatur; es bedeutet, dass das Verfahren ein Argument annimmt. Ich glaube, dass Sie

SEL sel = @selector(lowercaseString);

NSString Methode ist lowercaseString (0 Argumente), nicht lowercaseString: (1 Argument).

Denken Sie nicht an den Darm als Teil des Funktionsnamens, daran zu denken, als Trennzeichen, wenn Sie nichts haben zu trennen (kein Wert mit der Funktion gehen), dann nicht Sie brauchen es.

Ich bin mir nicht sicher, warum, aber all dieses OO Zeug scheint Apple-Entwickler fremd zu sein. Ich würde dringend empfehlen Visual Studio Express greifen und auch mit, dass das Spiel um. Nicht, weil man besser ist als die andere, nur, es ist ein guter Weg, um die Design-Probleme zu suchen und Denkweisen.

Wie

introspection = reflection
+ before functions/properties = static
- = instance level

Es ist immer gut auf verschiedene Weise zu einem Problem zu suchen und Programmierung ist das ultimative Puzzle.

Von meinem Verständnis der Apple-Dokumentation stellt ein Wähler die Namen der Methode, die Sie anrufen mögen. Die nette Sache über Selektoren Sie sie in Fällen, in denen die genaue Methode variiert aufgerufen werden können. Als einfaches Beispiel können Sie so etwas wie:

SEL selec;
if (a == b) {
selec = @selector(method1)
}
else
{
selec = @selector(method2)
};
[self performSelector:selec];

Wie pro Apfel docs: https://developer.apple.com/ Bibliothek / Archiv / Dokumentation / Allgemein / Conceptual / DevPedia-CocoaCore / Selector.html

  

Ein Selektor ist der Name, auszuwählen, um eine Methode auszuführen für ein Objekt, oder die eindeutige Kennung verwendet wird, die den Namen ersetzt, wenn der Quellcode kompiliert wird. Ein Wähler selbst tut nichts. Es identifiziert einfach eine Methode. Das einzige, was die Auswahlmethodenname unterscheidet sich von einem normalen String macht, ist, dass der Compiler stellt sicher, dass Wähler eindeutig sind. Was macht einen Wähler nützlich ist, dass (in Verbindung mit der Laufzeit) es wirkt wie ein dynamischer Funktionszeiger, der für einen gegebenen Namen, automatisch verweist auf die Implementierung eines Verfahren geeignet für welche auch immer Klasse mit verwendet wird. Angenommen, Sie einen Selektor für das Verfahren laufen hatte und Klassen Hund, Athlet, und Computersimulation (von denen jede eine Methode run implementiert). Der Wähler kann mit einer Instanz von jedem der Klassen verwendet werden, um seine Sicht aufrufen Methoden obwohl die Implementierung für jeden unterschiedlich sein könnte.

Beispiel: (LLDB) Haltepunkt --set Selektor viewDidLoad

Dies wird einen Haltepunkt auf allen viewDidLoad Implementierungen in Ihrer Anwendung festgelegt. So ist Selektor Art einer globalen Kennung für ein Verfahren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top