Pregunta

Tengo una aplicación que estoy escribiendo y que utiliza únicamente @properties.No tengo ningún ivar declarado en ninguno de mis archivos de clase.Según tengo entendido, los ivars ya no son necesarios con la introducción de @property.¿Estoy codificando según las mejores prácticas?¿Esto terminará mordiéndome el proverbial trasero a largo plazo?He estado leyendo críticas mixtas sobre lo que es "correcto" e "incorrecto"...

¿Fue útil?

Solución

Generalmente tampoco declaro ivars. a menudo usaré @synthesize foo = foo_; aunque para evitar el acceso directo cuando me refiero al método directo o viceversa. Y siempre dejo que el compilador sintetice automáticamente el ivar con el _ prefijo (que impide el acceso directo accidental, según el golpeado frase).

Y, como dijo Caleb, todavía hay ivars flotando por ahí, simplemente no los declaras explícitamente a menos que realmente quieras (lo cual, en realidad, no es así, ya que los ivars expuestos en los encabezados no son útiles para los clientes de la clase , si su API está diseñada adecuadamente).

También encuentro que la exageración sobre "usar solo acceso directo en init/dealloc, usar setter/getter en cualquier otro lugar" es en gran medida exagerada y, por lo tanto, solo usar setter/getter en todas partes.La realidad es que si tienes observadores durante la inicialización/desasignación, ya estás arruinado;el estado del objeto es, por definición, indefinido durante la construcción/destrucción y, por lo tanto, un observador no puede razonar correctamente sobre el estado.


Como señala Caleb, otra razón para usar el acceso directo a ivar en init/dealloc es evitar subclases que implementen lógica setter/getter personalizada que pueda vomitar debido al estado indefinido del objeto durante init/dealloc.

Si bien esto puede ser cierto, considero que es un defecto arquitectónico desagradable implementar definidores/obtenedores con un comportamiento personalizado.Hacerlo es frágil y hace que sea mucho más difícil refactorizar el código con el tiempo.Además, dicho comportamiento personalizado a menudo dependerá de otro estado dentro del objeto y esa dependencia conduce a dependencias de orden en cambios de estado que no se reflejan en absoluto en el aparentemente simple @property declaración.

Es decir.si sus definidores y captadores están escritos de manera que foo.bar = bad; no se puede ejecutar en cualquier tiempo en foo, entonces tu código está roto.

Otros consejos

No es tanto que se necesitan variables de instancia.Es solo esa instancia variable Las declaraciones no son necesarias.Dada una propiedad y una declaración @Syntsize, el compilador se encargará de crear la variable de instancia junto con los métodos de accesorios apropiados.

No hay nada de malo en usar las propiedades exclusivamente.Simplifican la gestión de la memoria.Tampoco hay nada de malo en usar IVARS sin propiedades, si eso es lo que quiere.Si desea usar las propiedades, pero no quiere anunciar los accesorios al resto del mundo (es decir, mantener la encapsulación), considere declarar sus propiedades no públicas en una extensión de clase (básicamente una categoría anónima en su archivo de implementación).

El uso de IVARS Ciertamente no está mal, sin embargo, las mejores prácticas ahora se presionan para usar @Property en su lugar.

Un lugar donde quiera que desee usar un IVAR es cuando desea declarar una propiedad protegida.Declara la propiedad en el archivo .m para una clase, y declara su IVAR correspondiente en el .h con la directiva @protected.Esto le permitirá tener un acceso protegido en la subclase.No hay alternativa para el acceso protegido a los miembros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top