2008-12-26 38 views
5

此問題已經衍生出此one.使用可可中的結構列表並不簡單。無論是使用NSArray和編碼/解碼,或使用C型陣列,並失去NSArray的商品。結構應該是簡單的,但是當需要列表時,人們傾向於建立一個類。在可可中使用結構列表是否合理?

什麼時候使用可用於可可的結構列表?

我知道關於結構和類已經有很多問題了,我讀過用戶認爲它對每種語言都是一樣的答案,但至少可可應該有它自己的具體答案,如果僅僅是因爲KVC或約束力(正如Peter在第一個問題上所建議的那樣)。

+0

KVC和綁定不是唯一的兩個原因,使東西的對象。其他能夠將其放入收集對象而不必裝箱/取消箱。你也可以很容易地測試某種東西是否是這種類型的對象 - 對於結構來說是不可能的。 – 2008-12-26 22:09:08

回答

11

可可有一些常見的結構類型,不是對象:NSPoint,NSRect,NSRange(和它們的CG對應物)。

如有疑問,請關注可可的領導。如果你發現自己處理大量小型的,大部分是數據的對象,你可能希望爲了效率而使它們成爲結構。

使用NSArray/NSMutableArray作爲頂級容器,並將結構包裝在NSValue中可能會讓您的生活變得更加輕鬆。如果你發現NSArray是一個性能瓶頸,或者如果這個數組本質上是隻讀的話,我只會選擇一個直接的C型數組。

1

一般來說,結構的使用意味着存在一個相對簡單的數據類型,它沒有邏輯關聯,也不應該有任何邏輯關聯。以一個NSPoint爲例 - 它僅僅是一個(x,y)表示。鑑於此,使用它也會產生一些問題。一般來說,對於這種類型的數據來說,這是可以的,因爲我們通常觀察點的變化而不是點的y座標(基本上,(0,1)與(1,1)不同減1個單位)。如果這是不受歡迎的行爲,那麼使用一個類可能是一個更好的主意。

2

使用結構體時非常方便且有用,特別是當您必須下拉到C時,例如使用現有庫或執行系統級別的工作時。有時你只想要一個緊湊的數據結構,而不需要類的開銷。如果你需要很多這樣的結構實例,它可以對性能和內存佔用產生真正的影響。

執行一系列結構的另一種方法是使用NSPointerArray類。它需要更多的思想來設置,但它的作用非常像NSArray之後,你不必打擾拳擊/拆箱或包裝在一個類,所以訪問數據更方便,而且它不佔據一堂課的額外記憶。

NSPointerFunctions *pf = [[NSPointerFunctions alloc] initWithOptions:NSPointerFunctionsMallocMemory | 
          NSPointerFunctionsStructPersonality | 
          NSPointerFunctionsCopyIn]; 
pf.sizeFunction = keventSizeFunction; 
self.pending = [[NSPointerArray alloc] initWithPointerFunctions:pf]; 
+0

對於使用iPhone SDK的用戶:NSPointerArray不適用於iPhone。 – Felixyz 2009-12-06 15:00:55

相關問題