Der Schlüssel zu dem Problem, auf das Sie gestoßen sind, beruht auf einem subtilen Punkt über Polymorphie in Objective-C. Da die Sprache das Überladen von Methoden nicht unterstützt, wird angenommen, dass ein Methodenname eine Methode innerhalb einer bestimmten Klasse eindeutig identifiziert. Es gibt eine implizite (aber wichtige) Annahme, dass eine überschriebene Methode dieselbe Semantik wie die überschriebene Methode hat.
In dem Fall, den Sie angegeben haben, ist wohl die Semantik von zwei Methoden nicht das gleiche; h., die erste Methode gibt eine neue Zeichenfolge zurück, die mit einer "abgestreiften" Version des Inhalts des Empfängers initialisiert wurde, während die zweite Methode den Inhalt des Empfängers direkt modifiziert. Diese beiden Operationen sind nicht gleichwertig.
Ich denke, wenn man sich genauer anschaut, wie Apple seine APIs nennt, besonders in Foundation, kann das wirklich helfen, einige semantische Nuancen aufzuklären. Zum Beispiel in NSString gibt es mehrere Methoden für eine neue Zeichenfolge der Schaffung einer modifizierten Version des Empfängers, wie
- (NSString *)stringByAppendingFormat:(NSString *)format ...;
Hinweis enthält, dass der Name ein Substantiv ist, wo das erste Wort des Rückgabewert beschreibt, und den Rest des Namens beschreibt das Argument. Nun vergleichen Sie diese mit dem entsprechenden Verfahren in NSMutableString für direkt an den Empfänger anhängt:
- (void)appendFormat:(NSString *)format ...;
dagegen diese Methode ist ein Verb, weil es kein Rückgabewert zu beschreiben. So ist aus dem Methodennamen allein klar, dass -appendFormat: auf den Empfänger einwirkt, während -stringByAppendingFormat: nicht und stattdessen eine neue Zeichenkette zurückgibt.
(By the way, gibt es bereits ein Verfahren in NSString, die zumindest einen Teil tut, was Sie wollen. -stringByTrimmingCharactersInSet:
Sie whitespaceCharacterSet
als Argument übergeben können Leerzeichen trimmen Vorder- und Hinter.)
So, während es kann Anfangs scheint es nervig zu sein, ich denke, Sie werden es auf lange Sicht wirklich sehen, wenn Sie versuchen, Apples Namenskonventionen nachzuahmen. Wenn nichts anderes hilft, wird Ihr Code besonders für andere Obj-C-Entwickler selbstdokumentierter. Aber ich denke, es wird auch helfen, einige semantische Feinheiten von Objective-C und Apples Frameworks zu klären.
Auch stimme ich zu, dass die internen Details der Klassenhaufen beunruhigend sein können, zumal sie für uns meist undurchsichtig sind.Es bleibt jedoch die Tatsache, dass NSString ein Klassencluster ist, der NSCFString für veränderbare und unveränderbare Instanzen verwendet. Wenn Ihre zweite Kategorie also eine weitere -strip
-Methode hinzufügt, ersetzt sie die -strip
-Methode, die von der ersten Kategorie hinzugefügt wird. Wenn Sie den Namen einer oder beider Methoden ändern, wird dieses Problem behoben.
Und da in NSString bereits eine Methode vorhanden ist, die dieselbe Funktionalität bietet, könnten Sie einfach die Methode "mutable" hinzufügen. Idealerweise würde sein Name der bestehenden Methode entsprechen, also wäre es:
- (void)trimCharactersInSet:(NSCharacterSet *)set
Wenn der Wert von S nicht festgelegt ist, sollten Sie nie etwas wie NSLog ([s strip]) tun. Wenn s den Wert @ "% @" hätte, würde es abstürzen. Es ist in der Regel nicht sinnvoll, darüber nachzudenken, ob Sie die Domäne s festgelegt haben, stattdessen sollten Sie sich stattdessen angewöhnen, dies zu tun: NSLog (@ "% @", [s strip]); –