2014-02-06 13 views
1

我正在編寫我的第一個iOS遊戲,並重構我的代碼並移動方法以與基本的MVC原則保持一致後,我意識到我現在需要從UIView子類的多個實例訪問UIColors的靜態NSArray。我的遊戲生成了許多顏色塊(外觀上類似於Tetris),並且是UIView子類的網格。每個塊都有一個int值的屬性,它與「objectAtIndex」一起確定數組中的哪個UIColor用作視圖填充顏色。Obj C - 從另一個不相關的自定義類訪問存儲在一個自定義類中的NSArray成員的最有效方法是什麼?

我意識到如果我把UIColors的靜態數組放在視圖子類中,這將是非常低效的,每個實例都會重複存儲數組。我想把它放在另一個處理許多其他遊戲設置和後勤的課程中 - 基本上只有一個實例(我相信這被稱爲單例)的遊戲的大腦。

所以我要求如何最好的訪問數組,如果我創建它作爲一個屬性在這個單身人士的幫助。請記住,因爲我將創建數百個將訪問這些UIColor值的UIView子類實例,所以訪問效率非常關鍵。也會有興趣聽到任何替代方法,以及每種方式的優缺點。

謝謝你的幫助。

+2

如果你正在創建數百個'UIView',那麼我懷疑數組訪問會比所有的內存分配和初始化以及視圖的gfx更嚴格的瓶頸... – 2014-02-06 22:02:21

+2

你可以用類似的方式訪問類之間的任何東西。它是一個NSArray的事實與你如何引用它無關。如果從多個類(或同一類的多個實例)訪問同一個數組並不意味着該數組已被複制(除非您錯過了這個方法)。只有對數組的引用需要傳遞。 –

回答

0

如果它是相同的UIView子類將訪問此數組,然後讓它是該類的實現文件中的靜態變量。

+0

感謝您的快速響應。這真的很簡單嗎? – KangleC

+0

您需要創建一個靜態變量來保存該數組。您可能需要有一個方法在第一次訪問時初始化它,但在此之後它可以使用已經初始化的同一個數組。 – Gavin

+0

@KangleC:嗯,這不是一個真正的MVC設計,但是你當然可以將一個數組分配給一個靜態變量。 – Chuck

1

似乎您只需要一個屬性爲您的視圖的UIColor。如果你想避免重複的情況下,你的控制器可以保存顏色數組並在創建時設置顏色。在這種情況下所需的存儲只是一個指針(你可以刪除那個int)。即使引用數組也需要一個指針。

請注意,這些對象(UIColorNSArray)使用引用計數並且是不可變的。所以你只需要確保你使用了一套獨特的顏色來避免重複。

真的,你應該避免創建100s的UIView s。 UIView圖表不會很高。而不是專注於重複的顏色,專注於如何在沒有所有這些繪製遊戲的情況下繪製遊戲(儘管它可能要複雜得多,取決於您需要繪製的內容)。

+0

有興趣瞭解除了使用UIViews顯示屏幕上顯示的顏色塊之外還有哪些其他選項?感謝您提供的信息。很有幫助。 – KangleC

+0

@KangleC在您的視圖中填充rects是一個簡單的起點。這是一個介紹實現'-drawRect:'的主題,並且有多個在線教程,演示如何使用像'CGContextFillRect'這樣的API。一旦您的'-drawRect:'可以填充矩形,然後嘗試在'-drawRect:'中繪製棋盤(使用一個'UIView'實例),然後考慮如何使用'CGContext *'繪製/表示遊戲* )在'drawRect:'中的函數。 – justin

+1

謝謝賈斯汀!當我在一個主視圖中繪製多個陰影矩形時,我錯誤地使用了drawRect來將每個新創建的子視圖充滿單個陰影矩形,繞過了這麼多的子視圖。偉大的提示,和愚蠢的疏忽對我來說!就像我說的,這是我第一個真正的應用程序。 – KangleC

相關問題