2010-04-18 17 views
5

algo que veo PPL definen la variable de la siguiente manera:Convención de nomenclatura en el objetivo C/C, comience con "_"?

b2World *_world; 
b2Body *_body; 
CCSprite *_ball; 

en lugar de

b2World *world; 
b2Body *body; 
CCSprite *ball; 

me familiarizados con la segunda, pero no el primero. Por lo tanto, he comprobado la Wikipedia sobre la convención de nombres:

nombres que comienzan con doble subrayado o un guión bajo y una letra mayúscula están reservados para la ejecución (compilador, biblioteca estándar) y no deben utilizarse (por ejemplo __reserved o _Reserved).

Entonces, ¿tiene algún significado especial que comience con "_"?

El código vi lo que el uso de "_" para comenzar es aquí:

http://www.raywenderlich.com/457/intro-to-box2d-with-cocos2d-tutorial-bouncing-balls

The wiki page.

Respuesta

0

Por lo general, ellos están acostumbrados para las variables que no deben acceder sin entrar en el archivo actual/módulo/espacio de nombres/lo que sea, en idiomas que no admiten restricciones de acceso con algo así como una palabra clave private

+0

O estática en C. –

13

Existe una convención de larga data entre algunos desarrolladores de Objective-C para pr variables de instancia efix con un guión bajo. Puede ser útil de varias maneras: una, hace que sea más fácil detectar variables de instancia en un archivo .m; dos, alivia a los desarrolladores de tener que crear nombres creativos para los parámetros del método para evitar chocar con nombres de variables de instancia; y tres, como han señalado otros, indica que las variables de instancia son privadas y, por lo tanto, no se debe acceder de cualquier forma a lo largo del código.

De hecho, argumentaría para evitar el acceso a las variables de instancia directamente en métodos distintos de los descriptores de acceso (getters y setters), -dealloc y -init.... No es que nunca debas usarlos en otro lugar, pero al menos deberías pensarlo un poco antes de usar una variable de instancia directamente en otros métodos.

-1

Apple reserva nombres que comienzan con guiones bajos para sus propios métodos y iva privados. En Objective-C en cualquier plataforma de Apple, se recomienda que no marque sus identificadores con un guión bajo.

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html

+0

-1 Apple * no * reserva las variables de instancia con el prefijo subrayado. Por el contrario, alientan a todos los desarrolladores a utilizar los prefijos de subrayado para ivars; de hecho, el mecanismo de autosíntesis introducido en Xcode 4.5 sintetiza ivars prefijados por defecto. – jlehr

+0

@jlehr: Su último punto no es cierto. Los ivars sin sintetizadores tienen exactamente el mismo nombre que la propiedad por defecto. –

+1

@JeremyP: jlehr tiene razón sobre su punto anterior. Su enlace apunta a un artículo sobre nombres de métodos, no ivars. El compañero ivar-concerniente se puede encontrar aquí: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-1001757 –

3

Es realmente muy útil, pero la mayoría de la gente no sabe por qué, y eso es una vergüenza. Apple usa guiones bajos para separar la manera en que otros objetos acceden a las variables de un objeto en particular, y la forma en que un objeto en particular accede a sus propias variables. Ahora bien, esto puede sonar un poco extraño, pero imagina lo siguiente: Es probable que todos reconocen el siguiente compilador de advertencia

.h 
@property (nonatomic, retain, readonly) UITableView *tableView; 

.m 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return [self loadSomethingElseForTableView:tableView]; 
} 

Esto dará lugar a una advertencia del compilador, ya que no sabe ya sea que se hace referencia a la variable local "tableView", o la variable de instancia. Por lo tanto, Apple recomienda agregar lo siguiente a la parte superior de su @implementation.

@synthesize tableView = _tableView; 

Ahora, cuando se hace referencia a _tableView, el compilador sabe que quiere decir la variable de instancia, y no con la local.

Además, esto hace que sea mucho más fácil comprender la recolección de basura en Obj-C y evitar cometer errores comunes.

Por ejemplo, cuando se hace lo siguiente:

@property (nonatomic, retain, readonly) NSString *title; 

- (id)initWithTitle:(NSString *)title { 
    if ((self = [super init])) { 
     self.title = title; // Is not possible, since it's read only. 
     title = title; // Is not possible, since it's the same (local) variable. 
     // Changing the method to initWithTitle:(NSString *)aTitle; 
     title = aTitle; 
    } 
    return self; 
} 

Ahora, puesto que no se utiliza la incubadora por defecto (en realidad, no se puede, porque es de sólo lectura) que necesidad para retener el variable usted mismo. Esto es mucho más fácil de recordar cuando le da un prefijo a cada variable de instancia (para que sepa que necesita retenerlo usted mismo). Por lo tanto, básicamente, es importante comprender la diferencia entre self.variable y (_) variable. (Es decir: self.variable mapas a [self setVariable:...] y variable Se correlaciona directamente con el puntero del

Por otra parte, cuando se agrega como una variable privada, así:.

@interface TSSomeObject : NSObject { 
@private 
    NSString *_privateTitle; 
} 
@end 

El prefijo de subrayado no es realmente necesario, a menos que pueda encontrar variables locales que tengan el mismo nombre. Además, también es una manera fácil de recordarle que es un puntero local y que necesita retener (y liberar) la variable cuando la asigna a su objeto.

Lo es equivocada es la creación de una propiedad con un prefijo de subrayado, así:

@property (nonatomic, retain) NSString *_title; 

Eso es realmente mal, y no estoy siquiera va a explicar por qué;)


Así que sí! ¡Deberías usar prefijos de subrayado, hace que tu código sea mucho más fácil de leer e interpretar por el compilador! En Xcode 4, Apple incluso agregó estos @synthesize a las plantillas predeterminadas.

0

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-1001757

Tanto por convención y la recomendación en el documento anterior, se debe anteponer Ivars con un guión bajo.

Es cierto que se trata de referencias explícitamente establecidas para las propiedades.

Pero el uso es el mismo, para indicar el uso de un ivar dondequiera que se vea.

Sin embargo, estoy abierto a la posibilidad de que, en ese contexto, el uso de un subrayado con el prefijo ivar podría indicar al usuario que están haciendo algo mal. Mientras tanto, un guión bajo fijo podría usarse para ivars puros a los que se debe acceder directamente.

Este blog tiene algunos buenos pensamientos de un practicante experimentado y recomienda utilizar guiones bajos prefijados.

http://blog.bignerdranch.com/463-a-motivation-for-ivar-decorations/

El tiempo que elige utilizar guiones prefijados para decorar sus propias Ivars, hay al menos alguna evidencia de que algún tipo de decoración le ayudará a evitar errores. Y los subrayados prefijados son la decoración más común.

Cuestiones relacionadas