2010-04-02 9 views
7

Tengo una clase Canción con propiedades Título, Clave, Artista, etc. No hay métodos. Recorro una base de datos de canciones y creo un objeto Song para cada una de ellas, completando las propiedades y luego almacenando los objetos Song en un NSArray.Objetivo C ¿Clase o estructura?

Entonces pensé, ¿por qué no simplemente tener una canción struct con todas esas mismas propiedades en lugar de una canción de clase? Hacerlo eliminaría los archivos de clase, la línea de canción Importar en el archivo .m de la clase en uso y la necesidad de asignar, iniciar, liberar.

Por otro lado, tendría que poner la definición de estructura en cada clase que pueda necesitarla. (A menos que haya alguna ubicación accesible a nivel mundial, ¿está allí?) Además, ¿se puede almacenar una estructura en un NSArray?

Respuesta

18

Lo haría con una clase. Una estructura no se puede almacenar en un NSArray (o cualquiera de las otras clases de contenedor para el caso), a menos que lo ajuste en un NSValue, lo que se puede hacer, pero es un poco complicado.

Además, como ha señalado, debe definir la estructura en algún lugar. La forma normal sería definirlo en un archivo de encabezado (.h) igual que para una clase. Entonces no hay 'ganancia' de una estructura allí.

+0

Genial, ahora lo sé. –

+1

Una estructura se puede almacenar de forma bastante eficiente en un NSPointerArray sin NSValue (debe describir la estructura mediante varias funciones). Pero bajo ARC, las estructuras ya no pueden contener objetos, como NSString: tendrías que convertir algo como el título de una canción en un char, lo que hace que las estructuras sean mucho menos útiles. Entonces, estoy cambiando a clases. –

2

Podría ir en ambos sentidos, pero ¿por qué no separar sus preocupaciones y mantenerlo en su propio archivo de clase? Además, hacerlo está más en línea con el Principio de Responsabilidad Individual de SOLID. ¿Por qué dar a su archivo de clase principal otra razón para cambiar? Romperlo.

+0

Gracias, buen punto. –

6

No puede almacenar estructuras en un NSArray (observe las firmas de sus métodos, todos ellos toman y devuelven objetos). Pero además de eso, como dije en la respuesta al another recent question, poner objetos en estructuras es casi siempre una mala idea. Los objetos necesitan ser retenidos y liberados, y las estructuras no tienen un código asociado con ellos para garantizar que esto ocurra en los momentos adecuados. Esto tiene más sentido como un objeto modelo.

+0

Gracias, buen punto. –