Frage

Der Unterstrich in Objective-C ist offenbar für Apples „internen“ reserviert (und war mit privaten Instanzvariablen zur Verfügung vor Apples Anspruch). Aber warum sollten sie verwenden, um eine double -underscore in ihrem SQLiteBooks Beispiel für das iPhone? Sehen Sie diese Schnipsel aus MasterViewController.m genommen:

+ (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (__editingViewController == nil) {
        __editingViewController = [[EditingViewController alloc] initWithNibName:@"EditingView" bundle:nil];
    }
    return __editingViewController;
}

Es gibt Erwähnung Doppelstrich Nutzung auf diesem Forum wie es auf C bezieht - „Compier internen Gebrauch“ es ist für den Ich glaube, ich sehe nicht, wie das in dieser Situation anwendbar ist.

Ich brauche eine Viewcontroller in meiner app, die ähnlich wie die, in dem SQLiteBooks Beispielprojekt verhalten würde, aber dieser Doppelstrich habe mich verblüfft.

War es hilfreich?

Lösung

Weder der C-Compiler noch die Objective-C-Compiler behandelt Variablennamen mit führenden anders als alle anderen Variablennamen unterstreicht. Ein einfacher oder doppelte Unterstrich ist einfach ein Konvention und bildet effektiv einen Namensraum, ähnlich wie der NS Präfix in Cocoa Klassen wie NSString.

auf dem Code SQLiteBooks Sehen, MasterViewController.m definiert diese statische globale Variable:

// Manage the editing view controller from this class so it can be easily accessed from both the detail and add controllers.
static EditingViewController *__editingViewController = nil;

Also meine Vermutung ist, dass der Autor von SQLiteBooks einen doppelten Unterstrich verwendet eine globale Variable anzuzeigen.

C Compiler (und durch Erweiterung Objective-C) Reserve Namen mit zwei Unterstrichen beginnen und ein Großbuchstaben für die Verwendung durch den Compiler-Anbieter, so dass ihnen einen reservierten Namensraum zu verwenden, um globale Variablen und Funktionen implementieren Standardbibliotheken geben, oder Einführung neuer nicht-Standard-Schlüsselwörter wie __block.

Während der SQLiteBooks Code technisch gültig ist, ist es auch leicht mit dem reservierten Namensraum meiner Meinung nach verwirrt. Wenn Sie diesen Code nicht wieder verwenden, würde ich empfehlen, diese Variable umbenennen (Xcode hat eine sehr schöne Umbenennungs Refactoring, dass es automatisch für Sie tun wird).

Andere Tipps

Um den Compiler sind Unterstrichen wie jedes alphabetische Zeichen behandelt. Mehr obwohl in der Regel ist Unterstrichen in der Regel durch Spracherweiterungen oder große Bibliotheken zu vermeiden Konflikte mit Code Benutzern.

Unterstrichen Verwendung ist problematisch, weil viele Gruppen versuchen, jeden Namen mit einer bestimmten Kombination von Unterstrichen zu reservieren.

Apple hat traditionell verwendet einen einzigen Unterstrich Präfix eine private Instanzvariable (ein gemeinsamer Stil in objektorientierten Sprachen) zu bezeichnen. Dies wurde genommen implizieren, dass jeder seine ivars mit Unterstrichen Präfix sollte bis Apple darauf hingewiesen, dass ein Unterstrich in Ihrem Code verwenden Konflikte mit Cocoa schaffen könnte, wenn Apple sich entscheiden, ihre Header zu ändern und vielleicht sollten Sie nicht. So haben unterstreichen Präfixe zu einer „nicht zu empfehlen“ Codierung der Praxis.

In C und C abgeleiteten Sprachen, jedes Wort mit doppelten Unterstrichen vorhergehenden und folgenden ist eine Nicht-Standard-Spracherweiterung. Siehe Apple-Erweiterungen wie __attribute __

Nachgestellte Unterstrichen werden oft als Compiler oder Debugger Namen verstümmelten Versionen von Original-Namen hinzugefügt (vor allem, wenn die Compiler Multi-Pass) zur Verfügung und sind in der Regel vermieden, so dass diese Namen von den Originalen klar getrennt bleiben. Google Suffix ihre Objective-C lokalen Instanzvariablen mit Unterstrichen Konflikten mit Apples Unterstrichen zu vermeiden.

Mein Rat: nicht Unterstrichen verwenden. Sie sollten nicht auf lokale Variablen mit dem gleichen Namen wie Instanzvariablen werden (das ist nur verwirrend). Der einzige mögliche Konflikt zwischen den Parametern in Setter-Methoden und die entsprechenden Instanzvariablen - und Sie sollen wahrscheinlich die Parameter mit einem kleinen „a“, „neuem“ (oder ähnlich) Präfix, da dies weist darauf hin, deutlich, dass der Parameter die eingehenden Werte ist aber noch nicht „der“ Wert.

Es ist nur eine Variable-Namenskonvention. Es ist nicht tun nichts. Es ist ein Weg für die Programm-Autoren sich zu erinnern: „Das ist eine private Variable.“

Es ist nicht ungewöhnlich für Compiler / Bibliothek Anbieter bestimmte Pre / Postfix bezeichnen als „reserviert“ für sie. Dies ist im Wesentlichen keine unbeabsichtigten Konflikte zwischen verschiedenen Arten zu vermeiden / definiert / geerbten Variablen.

Der Beitrag, den Sie beziehen sich auf zum Produkt definiert, keine Variablen. Viele Compiler verwenden doppelt Unterstrichen für die definiert sie bieten und verlassen sich auf.

Wie, warum es der Beispielcode verwendet diesen Stil -. Der ursprüngliche Autor die gleiche Codierung Stil verwendet er beschäftigt wahrscheinlich in seiner täglichen Arbeit und der möglichen Konflikt wurde nie hervorgehoben

Sie sollten in Ordnung sein das Codebeispiel beibehalten wie sie ist, aber wenn es Ihnen unangenehm ist, dann können Sie die Variable umbenennen.

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