Question

Le seul trait de soulignement en Objective-C est apparemment réservée à un usage « interne » d'Apple (et était disponible pour une utilisation avec des variables d'instance privées avant la demande d'Apple). Mais pourquoi seraient-ils utiliser à double -underscore dans leur SQLiteBooks exemple pour l'iPhone? Voir cet extrait tiré de MasterViewController.m:

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

Il y a mention de l'utilisation double underscore sur cette Forum en ce qui concerne C - il est pour le « usage interne de Compier. » Je suppose que je ne vois pas comment cela est applicable dans cette situation.

Je besoin d'un ViewController dans mon application qui se comporterait un peu comme celui du projet exemple de SQLiteBooks mais cette double underscore me a perplexes.

Était-ce utile?

La solution

Ni le compilateur C, ni le compilateur Objective-C traite les noms de variables avec traits de soulignement différemment que tout autre nom de variable. Un leader simple ou double underscore est simplement convention et forme effectivement un espace de noms, tout comme le préfixe NS utilisé dans les classes de cacao comme NSString.

En regardant le code SQLiteBooks, MasterViewController.m définit cette variable statique globale:

// 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;

Alors je suppose que l'auteur de SQLiteBooks utilise un double underscore pour indiquer une variable globale.

compilateurs C (et par extension Objective-C) noms de réserves en commençant par deux traits de soulignement et une lettre majuscule pour être utilisé par le fournisseur du compilateur, en leur donnant un espace de noms réservé à utiliser pour les variables globales et les fonctions utilisées pour mettre en œuvre des bibliothèques standard, ou introduire de nouveaux mots-clés non-standard comme __block.

Alors que le code de SQLiteBooks est techniquement valide, il est trop facilement confondu avec l'espace de noms réservé à mon avis. Si vous réutiliser ce code, je vous recommande de renommer cette variable (Xcode a une très belle refactoring de renommage qui le fera automatiquement pour vous).

Autres conseils

Pour le compilateur, underscores sont traités comme un caractère alphabétique. Mais plus généralement, underscores sont généralement utilisés par des extensions de langage ou de grandes bibliothèques pour éviter les conflits avec le code utilisateur.

L'utilisation underscores est problématique parce que beaucoup de groupes tentent de réserver tous les noms avec une combinaison spécifique de underscores.

Apple a traditionnellement utilisé un seul préfixe de soulignement pour désigner une variable d'instance privée (un style commun dans les langages orientés objet). Cela a été considéré comme impliquant que tout le monde devrait précéder leurs Ivars avec underscores jusqu'à ce qu'Apple a fait remarquer que l'aide d'un trait de soulignement dans votre code pourrait créer des conflits avec Cocoa si Apple décide de changer leurs têtes et peut-être vous ne devriez pas. Alors préfixes sont devenus soulignent un « pas conseillé » la pratique de codage.

Dans les langues dérivées C et C, un mot avec double underscores et qui suit est précède une extension du langage non standard. Voir les extensions d'Apple comme __attribute __

underscores Trailing sont souvent ajoutés comme compilateur ou nom de débogueur versions mutilées des noms originaux (en particulier lorsque le compilateur est multi-passes) et sont généralement évités afin que ces noms restent clairement distincts des originaux. Google suffixe leurs variables d'instance locale Objective-C avec des underscores pour éviter les conflits avec les underscores d'Apple.

Mon conseil: ne pas utiliser underscores. Vous ne devriez pas utiliser des variables locales avec le même nom que les variables d'instance (qui est juste confusion). Le seul conflit potentiel entre les paramètres des méthodes setter et les variables d'instance correspondantes - et vous devriez probablement préfixe le paramètre avec un « a » minuscule, « nouveau » (ou similaire) car cela indique clairement que le paramètre est les valeurs entrantes mais il est pas encore « la » valeur.

Il est juste une convention de dénomination des variables. Il ne faire quoi que ce soit. Il est un moyen pour le programme-écrivains de se rappeler, « Ceci est une variable privée. »

Il est pas rare que les vendeurs compilateur / bibliothèque pour désigner certains pré / postfixes comme « réservé » pour eux. Ceci est en grande partie pour éviter tout conflit entre les types par inadvertance / définit / les variables hérité.

Le message que vous faites référence à est, en ce qui concerne définit pas les variables. De nombreux compilateurs utilisent doubles underscores pour les définit qu'ils fournissent et utilisent.

Quant à savoir pourquoi il le code exemple utilise ce style -. L'auteur original utilisé le même style de codage, il utilise probablement dans son travail de tous les jours et le conflit potentiel n'a jamais été mis en évidence

Vous devriez être bien retenir l'exemple de code tel quel, mais si elle vous rend mal à l'aise, vous pouvez renommer la variable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top