2012-05-03 20 views

Respuesta

13

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

+3

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. –

+0

* puede *, sin embargo agregar ivars a una extensión de clase (estrechamente relacionada, pero diferente de una categoría) – Sean

+1

@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

0

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

+1

No creo que sea la misma pregunta, pero actualicé mi pregunta para dejarla más clara. – Besi

0

, 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.

+2

Esto no es verdad. ¿Qué pasa si declaraste la propiedad en el archivo .m? – Martin

+0

tiene razón, puede ocultar la propiedad por completo, pero no puede acceder desde fuera de su archivo-m, por ejemplo, una subclase. –

+1

@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

9

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.

+0

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

+0

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. –

+0

¿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

Cuestiones relacionadas