2010-04-02 8 views
7

J'ai une classe Titre avec des propriétés Titre, clé, artiste, etc. Il n'y a pas de méthodes. Je parcours une base de données d'informations de morceau et crée un objet Song pour chacun, remplit les propriétés, puis stocke les objets Song dans un NSArray.Objectif C Classe ou structure?

Puis j'ai pensé, pourquoi ne pas avoir juste un morceau struct avec toutes ces mêmes propriétés au lieu d'un morceau de classe. Cela éliminerait les fichiers de classe, la ligne #import Song dans le fichier .m de la classe using, et la nécessité d'allouer, init, release. D'autre part, je devrais mettre la définition de struct dans chaque classe qui pourrait en avoir besoin. (À moins qu'il y ait un emplacement globalement accessible - est-ce qu'il existe?) De plus, une structure peut-elle être stockée dans un NSArray?

Répondre

18

Je le ferais avec une classe. Une structure ne peut pas être stockée dans un NSArray (ou l'une des autres classes de conteneur d'ailleurs), à moins que vous ne l'enveloppiez dans un NSValue, ce qui peut être fait mais est un peu fastidieux. De plus, comme vous l'avez souligné, vous devez définir la structure quelque part. Le moyen normal serait de le définir dans un fichier d'en-tête (.h) comme pour une classe. Il n'y a donc pas de 'gain' d'une structure là-bas.

+0

Super, maintenant je sais. –

+1

Une struct peut être stockée assez efficacement dans un NSPointerArray sans NSValue (vous devez décrire la structure en utilisant diverses fonctions). Mais sous ARC, les structures ne peuvent plus contenir d'objets, tels que NSString: vous devez lancer quelque chose comme un titre de chanson pour un caractère, ce qui rend les structures beaucoup moins utiles. Donc, je change en cours. –

2

Cela pourrait aller dans les deux sens, mais pourquoi ne pas séparer vos préoccupations et le garder dans son propre fichier de classe? De plus, cela est plus conforme au principe de responsabilité unique de SOLID. Pourquoi donner à votre fichier principal une autre raison de changer? Brisez-le.

+0

Merci, bon point. –

6

Vous ne pouvez pas stocker des structures dans un NSArray (regardez les signatures de ses méthodes - elles prennent toutes et retournent des objets). Mais en plus de cela, comme je l'ai dit dans la réponse à another recent question, mettre des objets dans les structures est à peu près toujours une mauvaise idée. Les objets doivent être conservés et libérés et les structures n'ont pas de code associé avec eux pour s'assurer que cela arrive au bon moment. Cela a plus de sens en tant qu'objet de modèle.

+0

Merci, bon point. –