Al usar las propiedades de Objective-C puede dejar de crear variables de instancia o las variables de instancia explícitas (no las que se sintetizan por las propiedades) aún sirven para las propiedades inapropiadas?Cuándo usar las variables de instancia y cuándo usar las propiedades
Respuesta
Se puede detener la creación de variables de instancia por completo
No, usted no puede (en un sentido). Lo que puedes hacer es dejar de declararlos si tienes propiedades. Si sintetizas una propiedad y no has declarado el instvar, se declarará para ti, por lo que estás creando una variable de instancia, solo que no explícitamente.
¿todavía sirven para un propósito donde las propiedades serían inapropiadas?
Solía ser el consejo para crear propiedades para todo, ya que tener propiedades sintetizadas hace casi todos los retiros y lanzamientos para usted. Sin embargo, con ARC esa razón para usar propiedades para envolver la administración de la memoria se ha ido. El consejo ahora (para ARC) es, creo, usar propiedades para declarar su interfaz externa, pero usar variables de instancia directas donde la variable es parte del estado interno del objeto.
Esa es una buena razón para adoptar ARC: las propiedades vuelven a su verdadero propósito solo de ser parte de la API de la clase y ya no es necesario usarlas como una forma hacky para ocultar el trabajo de administración de memoria.
Editar
Una cosa más: ahora se puede declarar variables de instancia en el @implementation
por lo que ahora no hay necesidad de ningún escape detalles de implementación en el @interface
. es decir,
@implementation MyClass
{
NSString* myString;
}
// method definitions
@end
Y estoy bastante seguro de que funciona en categorías también. - vea el comentario a continuación
Esta cuestión se abordó antes here
Cuando se utiliza synthesize
se manejan las variables de instancia y una instancia para usted. Si está utilizando Lion con la nueva versión de XCode, eche un vistazo a las diversas propiedades en ARC in Transitioning to ARC
No creo que sea la misma pregunta, pero actualicé mi pregunta para dejarla más clara. – Besi
, siempre puede acceder a las propiedades desde el exterior. Entonces, si quieres que una variable solo se lea desde dentro de una clase, aún tienes que declarar un iVar. También el acceso a un ivar público con object->ivar
es ligeramente más rápido que usar un método-llamada.
Esto no es verdad. ¿Qué pasa si declaraste la propiedad en el archivo .m? – Martin
tiene razón, puede ocultar la propiedad por completo, pero no puede acceder desde fuera de su archivo-m, por ejemplo, una subclase. –
@Martin: como la propiedad se implementa como un par de métodos, siempre está disponible en tiempo de ejecución sin importar dónde se haya declarado. – JeremyP
Recomiendo declarar todo como propiedades y evitar ivars manuales por completo. No hay una ventaja real en la creación manual de ivars. Declare las propiedades públicas en su encabezado @interface
, declare las propiedades privadas en una extensión de clase privada en su archivo .m.
Para algunos de los puntos de JeremyP, el uso interno de accesorios todavía tiene un valor significativo bajo ARC, aunque la administración de la memoria ya no es una preocupación importante. Asegura que KVO funciona correctamente, mejora las subclases, admite arreglos personalizados (particularmente para cosas como NSTimer
), admite captadores personalizados (como para creación de instancias diferidas), etc. Es extremadamente propenso a errores tener una combinación de accesadores y ivars. Es demasiado fácil olvidar a qué debe acceder de qué manera.La consistencia es el sello distintivo de un buen ObjC.
Si absolutamente debe declarar un ivar por alguna razón, entonces debe hacerlo en el bloque @implementation
como señala JeremyP.
ACTUALIZACIÓN (-2013 de octubre):
Apple's guidance (De Programación con Objective-C: El encapsulado de datos):
mayoría de las propiedades están respaldados por variables de instancia
En general, debe usar métodos de acceso o sintaxis de punto para el acceso a la propiedad, incluso si está accediendo a las propiedades de un objeto desde dentro de su propia aplicación, en cuyo caso se debe utilizar
self
:...
La excepción a esta regla es cuando se escribe métodos de inicialización, o desasignación de descriptor de acceso personalizada, tal como se describe más adelante en esta sección.
KVO no es importante para algo que es solo interno. Ninguno de los dos está subclasificando. Nada de lo que es parte de la implementación de una clase debe filtrarse, incluso a las subclases. Este es el sello distintivo de un buen OOP. – JeremyP
A pesar de que KVO (aunque se usa la autoobservación de vez en cuando), ya que a menudo necesita accesoadores en propiedades privadas (instanciación lenta, seguridad de subprocesos, etc.) y su uso es simple y barato, siempre debe usarlos excepto cuando haya una razón fuerte para no (es decir, dealloc). A veces, el uso de ivars y, a veces, el uso de accessors es propenso a errores y difícil de auditar para la corrección. –
¿Cómo se hace la creación de instancias perezosas sin una variable de instancia? Lo repetiré: la línea oficial tal como se informa en la lista de Apple es usar variables de instancia para el estado interno cuando tienes ARC, pero para usar propiedades para todo si estás usando el recuento de referencias tradicional. – JeremyP
- 1. Cuándo usar las propiedades get y set en C#
- 2. Cuándo usar categorías y cuándo usar subclases?
- 3. Cuándo usar atributos vs. cuándo usar propiedades en python?
- 4. Cuándo usar Propiedades y cuándo Mapa en Java?
- 5. Cuándo usar Pepino y cuándo usar RSpec?
- 6. Cuándo usar las pruebas unitarias?
- 7. Cuándo usar self en las propiedades de clase?
- 8. ¿Cuándo usar == y cuándo usarlo?
- 9. cuándo usar Tarea y cuándo usar Subproceso?
- 10. Cuándo usar undef_method, y cuándo usar remove_method?
- 11. ¿Cuándo puedo comenzar a usar las propiedades establecidas usando UIAppearance?
- 12. Cuándo usar las clases en C#?
- 13. ¿Cuándo debe usar JCR y cuándo debe usar JPA/RDBMS?
- 14. ¿Cuándo usar las proyecciones de Hibernate?
- 15. Cuándo usar atributos en lugar de propiedades?
- 16. Cuándo usar vectores y cuándo usar matrices en C++?
- 17. Cuándo usar assert() y cuándo usar try catch?
- 18. Cuándo usar componentes y cuándo usar extensiones en Yii?
- 19. En Objective-C, ¿cuándo debería usar métodos de clase y cuándo debería usar métodos de instancia?
- 20. ¿Cuándo se establecen las variables de instancia de Ruby?
- 21. Cuándo usar un módulo y cuándo usar una clase
- 22. Cuándo usar GWT y cuándo no
- 23. ¿Cuándo debería usar require() y cuándo usar define()?
- 24. Cuándo usar OSGi EventAdmin y cuándo no?
- 25. Cuándo se deben usar las entidades HTML
- 26. ¿Cuándo Perl autoinicializa las variables?
- 27. Cuándo usar Restringir y cuándo no a
- 28. Cuándo usar colecciones frente a propiedades múltiples
- 29. Cuándo usar URL/session/cookie variables?
- 30. Cuándo usar Ruby vs Cuándo usar PHP
no puede agregar ivars y propiedades a categorías, ya que objc-runtime solo permite agregar ivars durante el registro de clases. No puede modificar un diseño de memoria de una clase después de que se haya registrado con el tiempo de ejecución. –
* puede *, sin embargo agregar ivars a una extensión de clase (estrechamente relacionada, pero diferente de una categoría) – Sean
@Jonathan Cichon: Gracias por eso, acabo de probarlo y resulta ser correcto sobre las variables de instancia pero incorrecto sobre las propiedades . Puede agregar propiedades pero no puede '@ sintetizarlas '. – JeremyP