2013-01-03 62 views
0

我在ViewController類使用的屬性稱爲日期,它的NSArray工作,所以在代碼中,我創建它使用:在ObjC中將對象設置爲另一個對象的值的正確方法是什麼?

self.dates = someFunctionThatReturnsAnNSArray; 

self.dates繼續在UITableView這是搜索的使用。

我想也拿一個self.dates數組的副本,並用它來填充名爲globalArray的AppDelegate屬性。所以在我的ViewController導入我AppDelegate並調用其sharedApplication方法,然後做到這一點:

AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate]; 
myDelegate.globalArray = self.dates; 

我的問題是,這是正確的方式做到這一點?怎麼樣複製或保留?

myDelegate.globalArray = [self.dates copy]; 
myDelegate.globalArray = [self.dates retain]; 

或者globalArray = arrayWithArray

myDelegate.globalArray = [NSArray arrayWithArray:self.dates]; 

這是推薦的格式,爲什麼?

+0

你怎麼聲明你的財產? –

+0

這取決於你想要做什麼,還有什麼可以做的價值。 –

回答

0

以你的問題,以便(包括隱含的問題)

是什麼self.dates = someFunctionThatReturnsAnNSArray嗎?

如果屬性聲明強(ARC)或保留(非ARC),那麼產生的制定者 - 這是你與點符號使用的是什麼 - 將添加到陣列中的保留計數所以它不會被垃圾收集。使用合成的setter,你不需要任何進一步的內存管理裝飾。

我想在我的AppDelegate中保留一個全局副本。這是一個好主意嗎?

「複製」在OO中可能是一個棘手的術語。它可能意味着另一個不同的集合,你可以通過說[array copy]得到相同的物品。這可能意味着所有項目的新副本。你可能不想要這些。我的猜測是,你只需要一個指向不同範圍內可用數組的指針。這通常被稱爲「分配」數組。

在任何情況下,應用程序委託可能不是一個保存它的好地方。應用程序委託是一個單身人士,所以很容易讓它成爲應用程序模型中真正有家的全局變量的傾倒地。

比方說,我想要另一個對象具有相同的數組作爲屬性,我該怎麼做?

另一個對象(如應用程序委託,即使我不同意這種設計)也可以用與原始相同的方式聲明一個屬性:nonatomic,strong或retain。使用點算符進行分配時,不需要進一步保留。

someArray = [NSArray arrayWithArray:self.dates]怎麼樣?這有什麼不同?

這就像複製。它將創建一個新的,獨特的自收集日誌文件。我的猜測是你真的只是想在不同的範圍內共享相同的數據。爲此,不需要copy或arrayWithArray。

+0

謝謝。我結束了使用CD在另一個視圖控制器中創建一個新的獲取。 – marciokoko

+0

很高興幫助。希望你現在沒有兩次獲取相同的數據。請記住,通過在另一個VC上聲明類似的屬性並分配數組,將這些數據「傳遞」給另一個VC就可以了。 – danh

0

問題的答案在某種程度上取決於所討論的數組是否可變或不可變,以及正在使用哪種併發性考慮(數組是否會被多於一個線程訪問和/或修改)。

您似乎還在使用非ARC語法,可能要考慮使用ARC。

如果數組是不可變的,那麼保留數組的副本應該沒問題。如果它們是可變的(並且你想能夠分別跟蹤這兩個數組),那麼你會想要做一個副本。

如果意圖是真的有一組數據(一個主數組),應該全局使用,那麼你可能只是想在你的視圖控制器上使用一些便捷方法來訪問主數組(並避免有兩個分開的指針)。

+0

vc中的self.dates數組是從CD獲得的。 CD從Web服務同步。該屬性(self.dates)用於填充tableview,因此其實際形式不可變。每次它在應用程序啓動時創建,應用程序就會從CD中同步並創建一個不可變數組。 – marciokoko

相關問題