2010-04-02 67 views
7

我有一個類屬性標題,關鍵,藝術家等歌沒有任何方法。我循環播放歌曲信息數據庫併爲每個歌曲創建一個歌曲對象,填充屬性,然後將歌曲對象存儲在NSArray中。Objective C Class or struct?

然後我想,爲什麼不只是有一個結構宋所有這些相同的屬性,而不是一個類的歌曲。這樣做會消除類文件,使用類的.m文件中的#import Song行,以及alloc,init,release的需要。

另一方面,我必須將結構定義放在每個可能需要它的類中。 (除非有全局可訪問的位置 - 有嗎?)另外,一個結構可以存儲在NSArray中嗎?

回答

18

我會做一個類。一個結構體不能存儲在一個NSArray(或其他任何容器類)中,除非你將它包裝在一個NSValue中,這可以完成,但有點費勁。

另外,正如您所指出的那樣,您必須在某處定義結構。正常的方法是將其定義在頭文件(.h)文件中,就像一個類一樣。所以在那裏沒有「收益」。

+0

太棒了,現在我知道了。 – 2010-04-02 15:02:38

+1

結構可以非常有效地存儲在NSPointerArray中,無需NSValue(您必須使用各種函數來描述結構)。但是在ARC之下,結構體不能再包含對象,比如NSString:你必須將類似歌曲標題的東西賦予char,這使得結構的用處不大。所以,我正在改爲上課。 – 2016-06-30 09:26:13

2

它可以兩種方式,但爲什麼不把你的問題分開,並保存在它自己的類文件?此外,這樣做更符合SOLID的單一責任原則。爲什麼要給你的主類文件另一個改變的理由?打破它。

+0

謝謝,好點。 – 2010-04-02 15:03:38

6

您不能將結構存儲在NSArray中(查看其方法的簽名 - 它們全部接受並返回對象)。但除此之外,正如我在回答another recent question時所說的,將對象放在結構中幾乎總是一個壞主意。對象需要保留和釋放,結構沒有與它們相關的代碼以確保在正確的時間發生。這使得模型對象更有意義。

+0

謝謝,好點。 – 2010-04-02 15:04:10