2009-08-19 11 views
7

Ich frage mich, warum Apple verwendet (ziemlich schwer in CoreAnimation, aber auch anderswo) Konstanten, die als NSString * const wie zum Beispiel kCAGravityTop anstelle von regulären Enums deklariert werden? Wie wäre es mit der Sicherheit in diesem Fall? Wie ich es verstehe, könnte man jeden NSString an eine Methode übergeben, die diese Konstante erwartet, ohne Compilerwarnungen zu erhalten.Gründe für die Verwendung von NSString-Konstanten über Enums?

Antwort

11

Ich bin mir nicht sicher, aber ich vermute, es hat damit zu tun, dass Benutzer ihre eigenen Erweiterungen und Unterklassen zu einigen der Apple-Sachen hinzufügen. In diesem Fall können Sie einfach die verwendete Methode überschreiben und den Fall mit der Zeichenfolge "MyOwnValue" abfangen und dann alles tun, was Sie wollen. Das ist wesentlich einfacher, als Apples Enum zu modifizieren, und es verhindert auch, dass man etwas verschraubt.

Es könnte auch für die Vereinfachung der Versionsunabhängigkeit von Apple sein. Wenn Sie bei Aufzählungen ihre Reihenfolge auf irgendeine Weise neu anordnen, kann dies zu vielen Problemen bei den Werten führen, die zwischengespeichert wurden (aus welchen Gründen auch immer). Wenn der Enum-Wert 1 < < 3 ist, wenn es in einer Datei gespeichert wird, fügt Apple eine weitere Enum ein, so dass der Wert jetzt 1 < < 4 ist, dann kommt offensichtlich das Falsche aus Ihrem Programm. Warum sollten sie nicht einfach vorsichtig sein, Enum-Werte zu verschieben, ich weiß es nicht, aber ich denke, dass es definitiv wahrscheinlich ist, dass sie NSString verwendet haben, weil ihr Wert oder ihre Reihenfolge in keiner Version geändert werden kann.

+0

eine Art Wrapper benötigen würden +1 Gute Hypothese – h4xxr

+0

Außerdem denke ich, Archivierung und Archivierung ist ein Faktor.Jetzt, wo Frameworks wie Core Data viel ausführlicher verwendet werden, finden Sie, wenn Enums verwendet werden, eine Menge Boxen und Unboxing, die einfach herausgerechnet werden können, wenn Strings verwendet werden, obwohl einige Überlegungen für String-Konstanten übrig bleiben - die Last von unnötigen "Sanitär" ist reduziert. – TheBasicMind

7

Ich vermute, dass der Grund mehr als alles andere historisch oder stilistisch ist. So haben es die NeXT-Frameworks geschafft und das hat den Cocoa "Style" geschaffen. Als ein Vorteil dieses Ansatzes kann die Überprüfung des Wertes im Debugger einen bedeutungsvollen Wert ergeben (z. B. @ "CAGravityTop" oder etwas Ähnliches anstelle eines bedeutungslosen int). Da statische Strings vom Compiler intelligent gehandhabt werden, kann der Vergleich durch Zeigervergleich statt durch String-Gleichheit erfolgen (siehe Antwort von bbum), so dass die Performance für diesen Ansatz vernachlässigbar ist.

9

Aufzählungstypen können nicht erweitert werden, ohne zusätzliche Einträge innerhalb des Aufzählungstyps selbst hinzuzufügen. Daher ist es unmöglich, Aufzählungsinhalte zu haben, die beide als formales Mitglied des Aufzählungstyps behandelt werden, aber auch während der normalen Kompilierung nicht sichtbar sind.

Nehmen Sie CoreAnimation zum Beispiel. Möglicherweise gibt es intern verwendete Werte, die aus verschiedenen Gründen nicht unterstützt oder über die öffentliche API verfügbar gemacht werden. "Implementation Detail" kommt mir sofort in den Sinn.

Darüber hinaus ermöglichen Zeichenfolgen als Konstanten Erweiterung, wie Eli impliziert. Sie neigen auch dazu, beim Debuggen viel informativer zu sein. "kCAGravityTop" ist viel aussagekräftiger als, sagen wir, "4".

In Bezug auf die Leistung gibt es sehr wenig Strafe für die Verwendung von Zeichenfolgen. Statische Strings, von denen das interne Gegenstück zu jeder externen Deklaration von fast jeder String-Konstanten tatsächlich zusammengesetzt ist, werden effizient vom Compiler gehandhabt und der -isEqualToString: Methode der erste Test ist Zeigergleichheit - sehr schnell. Nicht ganz so schnell wie ein switch(), aber angesichts der Größe der Codeausführung durch die Konstante ist die Differenz der paar Zyklen zwischen switch() und Stringvergleich irrelevant.

5

Ein weiterer Grund, warum ich von dem NSString zugunsten gedacht ist, dass es um übergeben kann, wo immer id (wie userInfo oder als Dictionary-Schlüssel) akzeptiert wird, während primitive Typen (Aufzählungen) für diesen

Verwandte Themen