2012-03-29 43 views
4

我似乎還沒有遇到問題,但我試圖確保我正在使用一些最佳實踐。使用ARC(強/弱)避免循環保留,學習一些基本知識

說我有一個UITableViewController與一個NSArray的MyObject對象的數據源。所以在我的UITableViewController我宣佈我的數據源,如:

@property (strong, nonatomic) NSArray *dataSource; 

後來我一觸碰電池我要推,顯示的東西的細節圖,使用電池的myObject的一個新的觀點。因此,在新的UIViewController我有這樣的:

@property (strong, nonatomic) MyObject *myObject; 

現在在的UITableViewController當細胞感動:

MyObject *myObject = [[self dataSource] objectForIndex:[indexPath row]]; 
NewView *view = [[NewView alloc] initWithMyObject:myObject]; 
// ... push onto nav controller, etc 

基本上,我怕的是我的陣列與宣佈,詳細視圖中的MyObject聲明爲,誰知道可能存在另一個視圖,同一個MyObject聲明爲

底線:這是在視圖之間傳遞對象的正確方法嗎?我的應用程序中還沒有真正使用過弱引用,我覺得這是不對的。任何幫助或幫助的鏈接將是驚人的。

回答

4

我認爲你需要了解的是弧的工作原理。

基本上任何有一個強指針指向它將被保留。

這是通過在物體添加一個引用計數器,所以當你這樣做:

@property (strong, nonatomic) MyObject *myObject; 

您創建myObject的一個強大的指針,(而不是對象)。

但是當你做到這一點

MyObject *myObject = [[self dataSource] objectForIndex:[indexPath row]]; 

你做這個指針增加凡是你必須從該數據源指定索引的引用計數。

重要的部分是,只要指針一直指向這個對象,它將保持活着。

關於您的意見。

在界面構建器中創建的視圖的元素在內部用強指針進行聲明。這是當你想使用參考。當您將自己的IBOutlet添加到視圖中的元素時,最好使其變弱。如果你從邏輯上考慮這個原因,它基本上意味着你不關心這個接口構建器元素,因爲你只希望它能夠在viewcontroller被釋放之前繼續存在。

當您通常遇到保留週期時,對象具有子對象,並且此子對象具有對其父項的引用STRONG

這是:

對象創建對象指針

對象點到對象指針

A將保持B活着並且B將保持A活着。

此頁面會向你解釋如何避免這種東西有些基本的東西:

http://cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html

而且關於通過視圖之間的對象,這是非常非常簡單。

首先從視圖1指針查看2(可以是強或弱取決於誰應保持視圖活着,如果從IB Builder中應該是弱,如果其編程應該是強)

其次,使視圖屬性(@property(強,非原子)的MyObject * myObject的;)

現在它是那樣簡單:

Self.view1Pointer.myObject = self.myOtherObject; 

瞭解如何在這裏兩種意見強烈指向這個對象所以這個對象將會保持爲活着只要1個意見沒有被解除分配。

你不會創建一個保留週期,您只需從該對象設置爲2的引用計數

注:當視圖被釋放,其所有指針都設置爲無,所以任何物體是指出他們的參考計數會減少。如果它達到0,它將被釋放。 (在之前的情況下,myobject將爲1,因爲另一個視圖仍然指向它)。

您將創建保留週期的唯一場景是,如果您設法將myObject指向強烈以及View2。所以現在他們互相保持着活着。 (但正如之前所解釋的,你可以讓myObject指向弱的查看2 哪些不會創建保留週期)。

您可以瞭解更多關於弧位置:

http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

+0

令人驚歎的答案。我正在教幾個朋友如何做簡單的iOS內容,但是我需要在我教導人們錯誤之前將自己的頭圍繞在覈心內存系統上。 – rnystrom 2012-03-30 18:00:00

4

這不是保留週期。這是一個很好的做事方式。 MyObject的實例沒有強烈地引用它的所有者,所以當最後的那些所有者最終被釋放時,對象也是如此。

+4

燁。這很好。數組爲+1,當細節vc被推動時myObject爲+2,當彈出並最終釋放時爲+1。如果從數組中刪除myObject,它的保留計數將變爲0。如果持有數組的視圖控制器被釋放,數組也將被釋放,釋放它的內容。就像你想要的一樣。 – danh 2012-03-29 23:26:48

+0

+1(雙關不打算)用於記錄保留計數。我想過,但太懶惰了。 – warrenm 2012-03-29 23:52:24