2009-07-31 13 views
5

estoy procedentes de Ruby a Objective-C y sigo haciendo:¿Cómo traigo seco (no repita usted mismo) a Objective-C

NSObject *foo; 

@property (nonatomic,retain) NSObject *foo; 

en el archivo .h, y luego en archivo .m:

@synthesize foo; 

en la parte superior y

[foo release] 

en dealloc.

Son 4 pasos para sumar foo! ¿Los programadores experimentados de Objective-C hacen los cuatro pasos manualmente todas y cada una de las veces que desean agregar una nueva variable de instancia a una clase? ¿Me estoy perdiendo una forma de hacer esto SECO?

+0

Gracias a ARC y propiedades automáticas, que ahora pueden deshacerse de un exceso de esos! Y el resto no es muy seco, es feo, como gran parte de Objective-C. –

Respuesta

6

Esta es una preocupación común también en C++ (doblando las declaraciones, aunque es cierto que es un poco diferente). La respuesta corta es que así es como se construye el lenguaje. Realmente no va en contra de DRY ya que cada declaración es única y tiene su propio propósito. Sin embargo, es ciertamente muy detallado para los estándares de hoy.

+1

Simplemente alégrate de que no estés escribiendo getters y setters ... ¡Piénsalo como _más_ DRY que las alternativas! –

+2

Al igual que todos los idiomas, algunas cosas en objetivo-c son alegres, mientras que otras cosas son una tarea ardua. –

+0

@ben en realidad si está codificando bien, no tiene reguladores, captadores o propiedades, pero la mayoría de las personas no programan muy bien (debo decir que no tiene instaladores y tiene relativamente pocos captadores) –

0

Objective-C es una capa muy delgada en la parte superior de C. En un nivel bajo, la mayoría de las cosas "objetivas" se compilan para codificar los punteros que se inyectan en el proceso de compilación C.

Agregaron el conteo de referencias (el sistema de recolección de basura más básico) pero debido a su naturaleza, todo se hace a mano, de ahí las llamadas de "Liberación".

Las versiones que no son iPhone han agregado un sistema de recolección de basura real, pero esas no se reducen también porque la liberación no es tan determinista.

Mantenga sus objetos pequeños y enfocados, y la sintaxis de la propiedad no debe ser muy invasiva.

0

Sí, lo hago, pero espero que a diario alguien invente un script o algo para XCode para automatizarlo. (También prefiero

self.foo = nil 

en mis deallocs)

+0

Apple recomienda no utilizar setters y getters en init y dealloc por una buena razón. Por un lado, el objeto está incompletamente definido durante init/dealloc (especialmente si está subclasificado) por lo que llamar a otros métodos (incluidos setters/getters) puede provocar un comportamiento incorrecto. Considere el caso de que el colocador esté anulando u otro objeto que observe la propiedad. –

+0

¿Podría indicarme esa pieza de documentación? Es difícil mantenerse sincronizado con las actualizaciones de documentos. – IlDan

0

usted será capaz de conseguir alrededor de tener que declarar tanto la variable de instancia y la propiedad una vez equipos de 32 bits se olvidan, como el tiempo de ejecución de 64 bits puede sintetizar variables de instancia. Pero no puede estar completamente SECO en un lenguaje donde las cosas deben declararse en un archivo de encabezado e implementarse en otro. El lenguaje requiere duplicación. La única forma de hacerlo sería crear un metalenguaje.

Puede usar scripts para eliminar la duplicación de tipear la misma variable repetitiva una y otra vez, pero seguirá estando allí en el código.

Por cierto, no creo que la declaración @synthesize sea información duplicada. Nada más en su código indica qué accesos se utilizan para llegar a la propiedad.

1

Como mencionaste que eres nuevo en Objective-C, quiero asegurarme de que eres consciente de que no tienes que crear propiedades para cada variable de instancia en tus clases, y de hecho probablemente no deberías t.

Las propiedades representan una interfaz que su clase proporciona para otras clases. Esta interfaz no coincide necesariamente con la implementación interna de la clase.En los casos en que son iguales, la sintaxis de propiedades declaradas lo hace (relativamente) simple de expresar.

Si sus clases están exponiendo la mayor parte de su estado interno a través de las propiedades, es posible que desee echar un vistazo más de cerca a su diseño, y si puede obtener un diseño más simple moviendo las responsabilidades.

3

Esta página http://pragprog.com/magazines/2010-07/not-quite-new-in-ios- reclamaciones, que se puede soltar la declaración de variables, que lo acerque a sólo 2 repeticiones :)

#import <UIKit/UIKit.h> 
@interface MoveMeViewController : UIViewController { 
} 

@property(nonatomic, retain) IBOutlet UIImageView *imageView; 
@end 
Cuestiones relacionadas