2011-08-24 10 views
14

Duplicar posibles:
How does an underscore in front of a variable in a cocoa objective-c class work?¿Por qué poner subrayado "_" antes de los nombres de variables en C Objetivo

En CI objetivo estoy viendo un montón de código con un guión bajo antes de los nombres de variables, por ejemplo, _someVariable

¿por qué es eso? también cómo escribir accedores es decir, obtener y establecer el método para dicha variable.

+0

upvoting porque creo que deberíamos estar familiarizados con todo tipo de convenciones de nomenclatura estándar. – amod

Respuesta

6

Los guiones bajos se utilizan a menudo para mostrar que las variables son variables de instancia. No es realmente necesario, ya que ivars puede tener el mismo nombre que sus propiedades y sus accesorios.

Ejemplo:

@interface MyClass : NSObject { 
    NSString *_myIVar;     // can be omitted, see rest of text 
} 
// accessors, first one is getter, second one is setter 
- (NSString *) myIVar;     // can be omitted, see rest of text 
- (void) setMyIVar: (NSString *) value; // can be omitted, see rest of text 

// other methods 

@property (nonatomic, copy) NSString *myIVar; 

@end 

Ahora, en lugar de declarar y la codificación de los descriptores de acceso myIVar y setMyIVar: usted mismo, puede dejar que el compilador de hacer eso. En versiones más nuevas, ni siquiera tiene que declarar myIVar en la interfaz. Usted declara la propiedad y deja que el compilador sintetice el resto para usted. En el archivo .m, que hace:

@implementation MyClass 
@synthesize myIVar; // generates methods myIVar and setMyIVar: for you, 
        // with proper code. 
        // also generates the instance variable myIVar 

// etc... 

@end 

Asegúrese de finalizar la cadena:

- (void) dealloc { 
    [myIVar release]; 
    [super dealloc]; 
} 

Fwiw, si quieres hacer algo más que la implementación predeterminada del getter o setter hacer, se puede todavía codifica uno o ambos, pero también tendrá que encargarse de la administración de la memoria. En ese caso, el compilador ya no generará ese acceso particular (pero si solo uno se hace manualmente, el otro aún se generará).

accede a las propiedades como

myString = self.myIVar; 

o, de otra clase:

theString = otherClass.myIVar; 

y

otherClass.myIVar = @"Hello, world!"; 

En MiClase, si se omite self., se obtiene el desnudo ivar. Esto generalmente solo debe usarse en los inicializadores y en dealloc.

+0

Muchas gracias, exagero y aceptación porque tus ejemplos son exactamente lo que estaba viendo. –

6

No lo hagas.

Los caracteres de subrayado simples son una convención de codificación interna de Apple. Lo hacen para que sus nombres no choquen con los tuyos. Si desea usar un prefijo en sus nombres de ivar, use cualquier cosa menos un guion bajo.

+0

Creo que algunas personas también lo usan para evitar el uso accidental de ivars primas en lugar de accesadores? – andyvn22

+1

Gracias buen ejemplo –

+0

¿'' __variable' (dos guiones bajos) significa interno peligroso adicional entonces? Estaba al tanto de la convención de los métodos internos, pero nunca había visto estos métodos hasta que me metí en una biblioteca de Apple. – Sirens

0

esto es una convención de nomenclatura utilizada normalmente para C++ para definir variable de instancia que son privados

como en una clase u puede tener

private: 
int __x; 

public: 
int GetX() 
{ 
    return this.__x; 
} 

esta es una convención de nomenclatura, i se vio obligado a utilizar en C++. Sin embargo, mi maestro nunca nos dijo el nombre de la convención de nombres. Pero creo que esto es útil y legible especialmente cuando no estás usando las convenciones de nomenclatura de Java.

+0

Muchas gracias, bonito exaplaination +1 –

+0

Java y Objective-C son dos idiomas diferentes. No asuma que solo porque puede hacerlo Java, debe hacerlo en Objective-C. – SevenBits

+0

@SevenBits Supongo que no ha leído mi respuesta correctamente. He mencionado que normalmente hacen que tu variable sea legible. En segundo lugar, los desarrolladores de Java normalmente siguen la notación camelCase para lograr la legibilidad. Lea la respuesta correctamente antes de votar. – amod

Cuestiones relacionadas