2012-03-03 13 views
13

¿Cuál es el nombre real de la variable de instancia, por ejemplo, topSpeed, como a partir de conferencias de la Universidad de Stanford sobre el desarrollo de Objective-C y iOS?Objective-C propiedad y sintetizar lógica

Aquí está el código:

@property (nonatomic) double topSpeed; 

En cuanto a este código voy a pensar que he definido un Topspeed variable en la clase. No puedo entender por qué declarará automáticamente el método getter con el mismo nombre que el nombre de la variable - topSpeed?

Otra cuestión es cuando usamos

@synthesize topSpeed = _topSpeed 

Y si nos fijamos en lo que el @synthesize generará:

- (double) setTopSpeed:(double)speed 
{ 
    _topSpeed = speed; 
} 


- (double) topSpeed 
{ 
    return _topSpeed; 
} 

Lo que se _topSpeed ​​aquí y lo que es Topspeed? He declarado una variable topSpeed ​​variable, no la _topSpeed. ¿Qué sucede si no uso la propiedad? ¿Cuál sería el nombre de la variable?

+0

http://stackoverflow.com/questions/3521254/prefixing-property-names-with-an-underscore-in-objective-c – Saurabh

Respuesta

36

En los primeros días de Obj-C y todavía hoy en día se declaran las variables en el archivo de cabecera de su clase, así:

@interface MySubclass : NSObject { 
    int varName; 
} 

Entonces se tendría que crear manualmente los métodos setter y getter a accede a la variable fuera de tu clase. Para ayudar a lidiar con la administración de memoria (útil para objetos), Apple introdujo propiedades en Obj-C 2.0 y le permitió definir los accesorios para una variable determinada. Se podría decir que una variable tendría ciertos atributos (tales como el mantenimiento o la copia de un valor, teniendo alternativo incubadora o captador nombre, etc) y que define esto como:

@property (someAttributes) int varName; 

entonces en su @implementation que podría @synthesize estas propiedades con los atributos dados y el compilador generarían métodos setter y getter para su variable.

@synthesize varName; // Generates -setVarName: and -varName for you 

Ahora, hoy la idea es que se puede alejarse de la aplicación de las variables de instancia en la sección {} y acaba de declarar una propiedad y una síntesis. Lo que obtenemos si nos limitamos a decir

@property (nonatomic) double topSpeed; 
@synthesize topSpeed; 

es un compositor y un captador denominado setTopSpeed: Topspeed y con una llamada Topspeed variable de instancia (creado por el compilador) para almacenar el valor. La idea detrás de @synthesize topSpeed = _topSpeed; es que el nombre de la variable de instancia será _topSpeed, pero los nombres de los usuarios seguirán siendo -setTopSpeed: y -topSpeed. Esto ayuda a la legibilidad del código porque puede haber confusión entre cuando dices self.topSpeed ​​o topSpeed ​​en tu código (el primero llama al descriptor de acceso, el segundo es el ivar). _topSpeed ​​se diferencia de las variables normales y también lo hace explícito cuando llamas self.topSpeed ​​(el acceso) vs _topSpeed ​​(el ivar). Apple también se está moviendo a esta sintaxis de subrayado, así que no piense que se está extinguiendo, porque es todo lo contrario. Actualización: (Consulte el comentario de Tommy)

También ayuda con las colisiones de nombres variables. Si tuvieran que aplicar setTopSpeed: usted mismo se vería algo como esto:

setTopSpeed:(double)topSpeed { 
    _topSpeed = topSpeed; // _topSpeed makes it obvious it's an ivar 
} 
+11

... y hoy en día '@synthesize topSpeed ​​= _topSpeed' está implícito en la' @ property' relacionada; no hay necesidad de incluirlo. Puede incluir una '' sintetización 'alternativa (por ejemplo, para especificar un nombre de variable de instancia sin un guión bajo inicial o simplemente no relacionado con la propiedad) o escribir el captador/instalador usted mismo (p. Ej., Si desea llamar, decir,' [ self setNeedsLayout] 'cuando la propiedad cambia) pero si no proporciona nada, entonces el compilador deducirá el habitual' @ sintetizar'. – Tommy

+0

_self.topSpeed ​​o topSpeed ​​en su código (que son 2 cosas diferentes) _ ¿Son estas dos cosas diferentes porque 'topSpeed' es la variable de instancia cuyo valor es devuelto por la propiedad' self.topSpeed'? – Trisped

+0

@Trisped Actualicé esa línea. Debería ser claro ahora. –

0

Para la primera pregunta, la respuesta es "convención de nomenclatura". Entonces es solo una convención de nomenclatura. Si desea acceder a la variable topSpeed, la parte "obtener" no es significativa, como [car topSpeed] es más fácil de leer que [car getTopSpeed]. En cuanto a la segunda pregunta, no estoy seguro, pero creo que tiene acceso a la propiedad topSpeed a través de la variable _topSpeed.

3
  1. Es un azúcar sintaxis, permiten escribir menos palabras.
  2. A diferencia de java/C++, en obj-c no se puede acceder a la variable de la clase. Solo puedes llamar sus métodos.
  3. @synthesize topSpeed = _topSpeed significa que quiere una variable llamada _topSpeed ​​y tiene Accessors llamados topSpeed ​​y setTopSpeed.
  4. @property (nonatomic) double topSpeed; es no a declaración de variable pura, También declarará a los usuarios también. Una variable pura de una clase Foo se verá así:

    @interface Foo: NSObject { double topSpeed; }

+1

"A diferencia de java/C++, en obj-c no se puede acceder a la variable de clase". Si se refiere a variables de instancia, puede acceder a ellas directamente en Objective-C si son '@ public'. –

Cuestiones relacionadas