? Puedo entender la definición de las funciones en la @interface del archivo de encabezado, pero ¿por qué las variables de instancia? ¿No deberían las variables de instancia ser privadas, solo accesibles a través de mensajes?¿Por qué las variables de instancia se definen en el archivo de encabezado en Objective-C
Respuesta
La razón es que puede calcular las compensaciones de variables para las subclases.
@interface Bird : NSObject {
int wingspan;
}
@end
@interface Penguin : Bird {
NSPoint nestLocation;
Penguin *mate;
}
@end
Sin conocer la estructura de la clase "Bird", la clase "Pingüino" no puede calcular el desplazamiento de sus campos desde el principio de la estructura. La estructura pingüino se ve algo así como esto:
struct Penguin {
int refcount; // from NSObject
int wingspan; // from Bird
NSPoint nestLocation; // from Penguin
Penguin *mate; // from Penguin
}
Esto tiene un efecto secundario: si cambia el tamaño de una clase en una biblioteca, romper todas las subclases de aplicaciones que enlazan con esa biblioteca. Las nuevas propiedades trabajan alrededor de este problema.
Aunque se declaran en el archivo de encabezado, todas las variables de instancia en Objective-C tienen @protected access de manera predeterminada. Esto significa que la variable es accesible dentro de la clase que lo declara y cualquier clase que hereda de esa clase.
Aquí está la documentación de Apple en la definición de una clase Objective-C: Defining Classes
Aviso la sección titulada "El ámbito de las variables de instancia".
Tomado de la sección de la documentación de Apple en la definición de las clases de Objective-C, The Role of the Interface:
Although instance variables are most naturally viewed as a matter of the implementation of a class rather than its interface, they must nevertheless be declared in the interface file. This is because the compiler must be aware of the structure of an object where it’s used, not just where it’s defined.
creo que es una cuestión técnica. Si lo entiendo correctamente, una clase de Objective-C es simplemente una estructura C de lujo. Y para que se use una estructura, debe conocerse su tamaño. (Al igual que, de lo contrario, sizeof() funcionaría)
Tenga en cuenta que en el nuevo Objective C 2.0 "Modern Runtime" (disponible en aplicaciones de iPhone y Mac OS X 10.5 de 64 bits) no necesita especificar los ivars, puede especificar las propiedades y luego usar @synthesize para generar los ivars.
Esto se debe a que en Modern Runtime, los ivars tienen un símbolo de indirección global que contiene el desplazamiento para el ivar. Esto también resuelve el problema de la clase base frágil, permitiendo que los ivars sean reordenados y agregados sin requerir la recompilación de subclases (eliminar o renombrar ivars aún puede causar errores de enlace).
Sin embargo, usted todavía tiene que enumerar las propiedades en la interfaz principal, por lo que no parece haber ninguna manera de ocultar por completo ivars privado que es desafortunado. No puede, por ejemplo, usar una propiedad y @synthesize en una categoría.
Puede, sin embargo, declarar una propiedad en una continuación y @synthesize en la @implementation principal. –
En caso de que alguien se tropieza con esta pregunta - como de XCode 4.2 con el compilador LLVM, se puede declarar variables de instancia en el @implementation usando la siguiente notación corsé:
@interface SomeClass : NSObject
@end
@implementation SomeClass {
NSString *myInstanceVariable_;
}
- (void)moreMethods {}
@end
Las variables de instancia general, no debe ser parte de la interfaz pública declarada de su clase: son detalles de implementación.
Sin embargo, ASEGÚRESE a definir sus variables de instancia dentro de las llaves o de lo definiremos una variable global que no tiene relación con la instancia del objeto:
@implementation SomeClass
NSString *whoopsGlobalVariable_;
- (void)moreMethods {}
@end
Acabo de investigar esto. Parece, por mis pruebas hasta ahora, que GCC no hará esto; da un error: "especificación de variable de instancia inconsistente". Solo compila con LLVM. Véase también [Declarar variables en @implementation] (http://stackoverflow.com/questions/7946998/declaring-variables-in-implementation). –
Correcto, requiere el compilador LLVM moderno. – sickp
- 1. ¿Cómo se definen las variables estáticas locales locales de subprocesos?
- 2. ¿Por qué los métodos C++ a veces se definen dentro de las clases?
- 3. ¿Cómo se definen las propiedades de una clase en php?
- 4. ¿Las variables de instancia son las nuevas variables globales?
- 5. palabra clave C++ extern en las funciones. ¿Por qué no solo incluir el archivo de encabezado?
- 6. Por qué las variables de instancia de mi controlador no funcionan en vistas (Rails)
- 7. ¿Por qué se escapan las variables $ _POST en PHP?
- 8. ¿Cómo se definen las variables de nivel de vista en ASP.NET MVC?
- 9. ¿Cómo se definen las instrucciones de uso en web.config?
- 10. ¿Cómo se definen las constantes de cadena en C++?
- 11. ¿Por qué las devoluciones de llamada de ActiveRecord requieren variables de instancia o métodos de instancia con el prefijo selfword?
- 12. En ObjectiveC, ¿los punteros son variables de instancia de clase inicializadas a 'nil', o de lo contrario?
- 13. ¿Cómo funcionan las variables de instancia en rspec?
- 14. ¿Las variables de instancia primitiva se inicializan por defecto en Objective-C?
- 15. ¿Por qué no se pueden compartir las variables miembro?
- 16. ¿Cómo se definen las sangrías en vim basadas en llaves?
- 17. ¿Cómo se definen las rutas relativas en Visual Studio Project?
- 18. Variables de instancia en el diseño
- 19. ¿Cuándo se establecen las variables de instancia de Ruby?
- 20. ¿Por qué las personas definen objeto extiende su clase compañera?
- 21. ¿Por qué no se definen las cadenas (y también los colores) en el espacio de nombres de Android?
- 22. ¿Por qué desactivar el encabezado en curl?
- 23. ¿Por qué las variables no se declaran en "probar" en el ámbito en "catch" o "finally"?
- 24. Las variables estáticas en los métodos de instancia
- 25. ¿Por qué las clases internas de Java requieren variables de instancia externas "finales"?
- 26. ¿Por qué veo las variables de JavaScript con el prefijo $?
- 27. ¿Por qué parece que Python trata las variables de instancia como compartidas entre objetos?
- 28. Variables de instancia vs. variables de clase en Python
- 29. ¿En qué objeto se almacenan las variables globales de Javascript?
- 30. Heredar variables de instancia en Objective-c
Son sólo las estructuras de C , ni siquiera los de lujo :-) así que algo como anObject-> anIVar funciona bien. Desafortunadamente, el tiempo de ejecución heredado permite este tipo de acceso incluso en variables @private y simplemente vomita una advertencia del compilador: -/ –