2010-04-02 18 views
7

Mam piosenkę klasową z tytułami, kluczem, wykonawcą itd. Nie ma żadnych metod. Przeszukuję bazę danych informacji o utworze i tworzę obiekt Song dla każdej z nich, zapełniając właściwości, a następnie przechowuję obiekty Song w NSArray.Klasyfikacja obiektu C lub struktura?

Potem pomyślałem, dlaczego nie po prostu mieć utwór strukturalny z tymi samymi właściwościami, a nie z klasowego utworu. Takie działanie wyeliminowałoby pliki klas, linię utworu #import w pliku .m klasy użytkowej oraz konieczność przydziału, init, wydania.

Z drugiej strony, musiałbym umieścić definicję struct w każdej klasie, która może jej potrzebować. (Czy jest tam jakaś globalnie dostępna lokalizacja - czy istnieje?) Czy struktura może być przechowywana w NSArray?

Odpowiedz

18

Zrobiłbym to z klasą. Struktura nie może być przechowywana w NSArray (lub w żadnej innej klasie kontenera), chyba że zawiniesz ją w NSValue, co da się zrobić, ale jest nieco skrzypiąca.

Dodatkowo, jak już zauważyłeś, musisz gdzieś zdefiniować strukturę. Normalnym sposobem byłoby zdefiniowanie go w pliku nagłówkowym (.h), tak jak w przypadku klasy. Więc nie ma tam "zysku" ze struktury.

+0

Świetnie, teraz wiem. –

+1

Strukturę można przechowywać dość sprawnie w NSPointerArray bez NSValue (trzeba opisać strukturę za pomocą różnych funkcji). Ale w ARC, struktura nie może już zawierać obiektów, takich jak NSString: musisz rzucić coś w rodzaju tytułu piosenki na char, co sprawia, że ​​struktury są o wiele mniej przydatne. Tak więc zmieniam się na klasy. –

2

Może to przebiegać w obie strony, ale dlaczego nie rozdzielić wątpliwości i zachować w swoim pliku klasy? Dodatkowo jest to bardziej zgodne z zasadą odpowiedzialności pojedynczej SOLID. Dlaczego nadać plikowi głównej klasy kolejny powód do zmiany? Rozwiąż to.

+0

Dzięki, dobra uwaga. –

6

Nie można przechowywać struktur w NSArray (spójrz na sygnatury jego metod - wszystkie pobierają i zwracają obiekty). Ale poza tym, jak powiedziałem w odpowiedzi na another recent question, umieszczanie obiektów w strukturach jest zawsze złym pomysłem. Obiekty muszą być zachowane i zwolnione, a struktury nie mają powiązanego z nimi kodu, aby zapewnić, że dzieje się to we właściwym czasie. Ma to więcej sensu jako obiekt modelu.

+0

Dzięki, dobry punkt. –