2012-03-26 14 views
12

En código no ARC, las propiedades retenidas se ocupan de la gestión de la memoria con la sintaxis self.property =, por lo que nos enseñaron a usarlas prácticamente para todo.Con ARC, ¿por qué usar @properties?

Pero ahora, con ARC, esta gestión de la memoria ya no es un problema, ¿así que la razón para usar propiedades se evapora? ¿hay alguna razón válida (obviamente que no sea para proporcionar acceso público a variables de instancia) para usar propiedades?

Respuesta

30

Pero ahora con esta ARC gestión de memoria ya no es un problema, también lo hace la razón para utilizar las propiedades evaporan? ¿Todavía hay algún buen motivo (obviamente, aparte de proporcionar acceso público a las variables de la instancia ) para usar las propiedades más?

Sí - mediante el uso de @property y getters/setters @synthesized, usted garantiza que:

  • su captador/definidor puede tener subclases y subclases puede anular el almacenamiento y/o comportamiento
  • todo queda muy bien encapsulado
  • puede utilizar ganchos de observación - KVO, etc ... - para supervisar los cambios internos y externos
  • tiene un lugar conveniente para establecer un punto de interrupción en la lectura y/o escribir en el profesional perty
  • si fuera necesario exponer esa variable de instancia "solo interna", se trata de copiar la declaración @property; mucho menos refactorización.
  • puede aprovechar el poder declarativo de todas las palabras clave diferentes modificadores - copia, fuerte, débil, atómico, etc .. - la que el compilador está tomando más y más ventaja de más de thime

Incluso internamente a una clase, generalmente me inclino por usar propiedades y sintaxis de puntos para mantener el estado dentro del objeto. Eso no es verdad universalmente - habrá algunas variables de instancia que manipulo directamente (exclusivamente manipular directamente; no @property en absoluto) si mi diseño es tal que la exposición implicaría una refactorización masiva de todos modos.

+6

También las propiedades también hacen que sea más fácil y seguro agregar semántica de copia y semántica atómica. Además de crear una propiedad con un nombre y una variable de instancia con otra usando @synthesize propname = ivarname; siempre es útil – Cthutu

+0

De acuerdo, gracias por la respuesta. También me gustaría añadir que se habla mucho sobre @property performance vs ivars. Te desafío a encontrar una diferencia de rendimiento entre una propiedad no atómica y una ivar ... es probablemente insignificante insignificante. –

+1

¿No estaría de acuerdo con que las palabras clave de modificador débiles, fuertes, atómicas, etc. son indicadores útiles para usted en su API y también para que el propio arco entienda su intención? – Jef

2

No creo que alguna vez haya usado propiedades simplemente por la administración de la memoria y no creo que deba hacerlo nunca. Entonces, para responder a su pregunta, no, no hay razón para usar propiedades que no sean para acceder a las variables de instancia, que es esencialmente para lo que se supone que deben usarse en primer lugar.

+0

Si no ha estado usando propiedades, probablemente lo haya estado haciendo mal. "A veces puede parecer tedioso o pedante, pero si usas los métodos de acceso consistentemente, las posibilidades de tener problemas con el manejo de la memoria disminuyen considerablemente. Si está utilizando retener y liberar variables de instancia en todo su código, seguramente hará lo incorrecto. " - Guía de programación de administración de memoria, Apple –

+0

@DaveBatton esa cita no se aplica a ARC –

+0

@JesseGumpo De acuerdo, no lo hace No se aplica a ARC. Pretendía que se aplicara al comentario de Kevin de que nunca "usó propiedades simplemente por la administración de la memoria ..." –

1

Estás hablando de dos cosas diferentes. ARC es para administrar la memoria, por lo que no tiene que estar cargado con una gran cantidad de dealloc y conservar las declaraciones.

Las propiedades están ahí para dar a una clase la oportunidad de controlar/limitar la exposición de sus iVars internos, exponiendo una API para otras clases para comunicarse/interactuar.

0

Además de retener, también hay otros modificadores que en ocasiones pueden ser muy útiles, p. 'copy' cuando se asignan bloques a las variables miembro de la clase, o 'readonly' que asegura que la propiedad no se puede escribir. Además, no se olvide de las propiedades 'dynamic' cuando trabaje con Core Data, y la posibilidad de ejecutar código personalizado al asignar o recuperar una propiedad (al definir getters/setters personalizados en lugar de usar @synthesize).

6

¿El motivo del uso de propiedades se evapora?

Con ARC haciendo que la "magia de propiedad" esté disponible para ivars, este aspecto particular de por qué uno elegiría propiedades sobre ivars se evapora. Sin embargo, muchos otros permanecen:

  • distinción atómica/no atómica está disponible para propiedades, no por Ivars
  • flexibilidad que ofrece propiedades (sólo lectura/leer + escribir distinción) no está disponible para Ivars
  • capacidad para llevar a cabo cálculo y comprobación de argumento no está disponible para Ivars

sigo utilizando propiedades como mi camino predeterminado de mantener el estado que puede estar expuesto a clases fuera o clases internas "entre hermanos", porque la flexibilidad adicional más pequeña es mayor que el de una costo adicional en tiempo de ejecución.