Soll ich eine temporäre Zwischenvariable beim Anhängen an einen NSString verwenden?

7

Das funktioniert - es kompiliert - aber ich wollte nur überprüfen, ob es als gute Praxis oder etwas zu vermeiden gilt?

%Vor%

Kann besser mit einer temporären Variable geschrieben werden:

%Vor%

nur neugierig.

    
fuzzygoat 24.11.2009, 17:27
quelle

4 Antworten

12

Intern zerlegen Compiler normalerweise Ihren Code in eine Darstellung namens "Single Static Assignment", wobei einer gegebenen Variablen immer nur ein Wert zugewiesen wird und alle Anweisungen so einfach wie möglich sind (zusammengesetzte Elemente werden in verschiedene Zeilen aufgeteilt). Ihr zweites Beispiel folgt diesem Ansatz.

Programmierer schreiben manchmal so. Es wird als die klarste Art des Schreibens von Code angesehen, da Sie alle Anweisungen als Grundtupel schreiben können: A = B Operator C. Aber es wird normalerweise als zu ausführlich für Code angesehen, der "offensichtlich" ist, also ein ungewöhnlicher Stil (außerhalb von Situationen) wo Sie versuchen, sehr kryptischen Code verständlich zu machen).

Im Allgemeinen werden Programmierer durch Ihr erstes Beispiel nicht verwirrt und es wird als akzeptabel angesehen, wenn Sie das ursprüngliche fileName nicht erneut benötigen. Viele Obj-C-Programmierer fördern jedoch den folgenden Stil:

%Vor%

oder even (abhängig vom horizontalen Abstand in der Zeile):

%Vor%

d. Wenn Sie nur einmal eine Variable verwenden, benennen Sie sie nicht (verwenden Sie sie einfach).

Auf stilistischer Ebene sollten Sie jedoch, wenn Sie dem Ansatz der Single Static Assigment-Methode folgen, nicht tempName als Variablennamen verwenden, da dies nicht die Rolle der Variablen erklärt - Sie würden stattdessen etwas verwenden wie fileNameWithExtension . Im weiteren Sinne vermeide ich normalerweise die Verwendung von "temp" als Präfix, da es zu einfach ist, alles "temp" zu benennen (alle lokalen Variablen sind temporär, haben also wenig Bedeutung).

    
Matt Gallagher 24.11.2009, 23:16
quelle
5

Die erste Zeile deklariert ein NSString-Literal. Es hat Speicher, der die Lebensdauer des Prozesses dauert, also muss nicht freigegeben werden.

Der Aufruf von stringByAppendingString gibt einen automatisch freigegebenen NSString zurück. Das sollte auch nicht freigegeben werden, wird aber dauern, bis es zum nächsten Autorelease-Pool-Drain kommt. Das Ergebnis des stringByAppendingString-Aufrufs dem filename-Zeiger zuzuordnen, ist also in diesem Fall vollkommen . Im Allgemeinen sollten Sie jedoch überprüfen, was Ihre Objektlebenszeiten sind, und sie entsprechend behandeln (zB wenn fileName als eine Zeichenfolge deklariert wurde, für die Sie den Speicher besitzen, müssten Sie sie freigeben, so dass eine temporäre Temperatur notwendig ist) .

Die andere Sache, die Sie überprüfen sollten, ist, ob Sie nach diesem Snippet irgendetwas mit fileName machen - z. Halte es in einer Instanzvariablen fest - in diesem Fall musst du es behalten.

    
philsquared 24.11.2009 17:34
quelle
2

Der Unterschied besteht nur darin, ob Sie noch den Verweis auf die Literalzeichenfolge benötigen oder nicht. Von der Speicherverwaltung POV und dem Objekt Creation POV sollte es eigentlich keine Rolle spielen. Eine Sache zu beachten ist jedoch, dass das zweite Beispiel es beim Debuggen etwas leichter macht. Meine bevorzugte Version würde so aussehen:

%Vor%

Aber am Ende ist das nur eine Frage der Präferenz.

    
tcurdt 24.11.2009 17:49
quelle
1

Ich denke, du hast recht, das liegt wirklich am bevorzugten Stil.

Persönlich mag ich dein erstes Beispiel, die Codes nicht kompliziert und die erste Version ist prägnant und einfacher für die Augen. Theres zu viel von der "Sprache" versteckt, was es im zweiten Beispiel tut.

Wie bereits erwähnt, scheint die Speicherverwaltung kein Problem in den Beispielen zu sein.

    
Neil Foley 24.11.2009 17:37
quelle

Tags und Links