Pregunta

La única subrayado en Objective-C es aparentemente reservado para uso "interno" de Apple (y estaba disponible para su uso con las variables de instancia privadas previas a la reclamación de Apple). Pero por qué iban a utilizar un doble -underscore en su ejemplo SQLiteBooks para el iPhone? Ver este fragmento tomado de MasterViewController.m:

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

No hay mención del uso de doble subrayado en este foro lo que se refiere a C - es para el "uso interno de Compier." Supongo que no veo cómo eso es aplicable en esta situación.

necesito un ViewController en mi aplicación que se comportan muy parecido al que en el proyecto SQLiteBooks ejemplo, pero esta doble subrayado me tiene perplejo.

¿Fue útil?

Solución

Ni el compilador de C ni el compilador de Objective-C trata a los nombres de variables con el líder de relieve de manera diferente a cualquier otro nombre de la variable. A subrayado simple o doble líder es simplemente un convención y forma efectivamente un espacio de nombres, al igual que el prefijo NS utilizado en las clases de cacao como NSString.

Si examina el código SQLiteBooks, MasterViewController.m define esta variable global estática:

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

Así que mi conjetura es que el autor de SQLiteBooks utiliza un subrayado doble líder para indicar una variable global.

compiladores de C (y, por extensión, Objective-C) Nombres de reserva comenzando con dos guiones bajos y una letra mayúscula para su uso por el proveedor del compilador, dándoles un espacio de nombres reservado a utilizar para las variables globales y funciones que se utilizan para implementar bibliotecas estándar, o para introducir nuevas palabras clave no estándar como __block.

Mientras que el código SQLiteBooks es técnicamente válida, es demasiado fácil confundirse con el espacio de nombres reservado en mi opinión. Si lo hace volver a utilizar ese código, le recomiendo cambiar el nombre de la variable (Xcode tiene un muy buen refactorización de cambio de nombre que lo hará automáticamente por usted).

Otros consejos

Para el compilador, guiones son tratados como cualquier carácter alfabético. En términos más generales, sin embargo, guiones se utilizan por lo general por extensiones de lenguaje o grandes bibliotecas para evitar conflictos con el código de usuario.

El uso de guiones es problemática porque muchos de los grupos tratan de reservar cada nombre con una combinación específica de subrayados.

Apple ha utilizado tradicionalmente un único prefijo de subrayado para indicar una variable de instancia privada (un estilo común en los lenguajes orientados a objetos). Esto fue llevado a entender que todo el mundo debe anteponer sus Ivars con guiones hasta que Apple señaló que el uso de un guión en el código podría crear conflictos con cacao si Apple decide cambiar sus cabeceras y tal vez no deberías. Así que subrayan los prefijos se han convertido en una práctica de codificación "no se recomienda".

en C y C idiomas derivados, cualquier palabra con subrayado doble precedente y siguiente es una extensión del lenguaje no estándar. Ver extensiones de Apple como __attribute __

guiones finales se agregan a menudo como compilador o nombre depurador versiones destrozados de nombres originales (especialmente cuando el compilador es multi-pass) y típicamente se evitan de manera que estos nombres siguen siendo claramente distintas de las originales. Google sufijo sus variables de instancia local de Objective-C con guiones bajos para evitar conflictos con los guiones de Apple.

Mi consejo: no utilice guiones bajos. No se debe utilizar variables locales con el mismo nombre que las variables de instancia (eso es sólo confuso). La única posible conflicto es entre los parámetros en los métodos setter y las variables de instancia correspondientes - y probablemente debe anteponer el parámetro con una letra minúscula "a", "nuevo" (o similar) ya que esto indica claramente que el parámetro es los valores entrantes pero aún no es "el" valor.

Es sólo una convención de denominación de variables. No hace lo nada. Es un camino para el programa-escritores recuerdan a sí mismos, "Esta es una variable privada."

No es raro que los vendedores compilador / biblioteca para denotar ciertos pre / sufijos como "reservado" para ellos. Esto es en gran parte para evitar cualquier conflicto inadvertidos entre los tipos / define / variables heredado.

El puesto que se refieren a es con respecto define, no variables. Muchos compiladores utilizan los dobles guiones para las define que prestan y confiar.

En cuanto a por qué el código de ejemplo utiliza este estilo -. El autor original utiliza el mismo estilo de codificación que probablemente emplea en su trabajo del día a día y el posible conflicto nunca fue resaltado

que debe estar bien conservando el ejemplo de código como está, pero si te hace sentir incómoda a continuación, puede cambiar el nombre de la variable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top