2009-02-13 41 views
1

我對保留我的屬性和內存管理方面感興趣。這是一個簡單的應用程序,用於編輯存儲在表中的類的信息。有3個ViewController。簡單的應用程序結構。你怎麼看?

  • 列表視圖(列表中的所有類)
  • 所選項目 的細節視圖(列出選定類的屬性)
  • 的編輯視圖(列出單個屬性選定類的
    並允許它 編輯)

這是它如何構造目前,你怎麼看?

ListViewController

@屬性(非原子,保留)的NSMutableArray *池;
@property(nonatomic,retain)PoolFacilityEditController * childController;

一類新實例添加到您點擊運行此方法添加按鈕表..

//Loads up the editPoolFacility controller to add a new pool 

- (無效){添加

PoolFacilityEditController *editController = self.childController; 

PoolFacility *aPoolFacility = [[PoolFacility alloc] init]; 

[self.pools addObject:aPoolFacility]; 
[aPoolFacility release]; 


editController.thePoolFacility = aPoolFacility; 

editController.pools = self.pools; 

[self.navigationController pushViewController:editController animated:YES]; 

}

的下一個控制器現在被加載,這裏是它有趣的實例變量。是否明智我選擇只將池分配給新的控制器,而不是保留。我不想不必要地保留。

詳細視圖

@property (nonatomic, assign) PoolFacility *thePoolFacility; (assigned in the above add method) 

@屬性(非原子,分配)的NSMutableArray *池; (也被分配在添加法)

詳細視圖具有執行以下操作的方法..

- (void)viewWillAppear:(BOOL)animated { 


//Pass the copy onto the child controller 
if (self.childController.thePoolFacility != self.thePoolFacility) { 
    self.childController.thePoolFacility = self.thePoolFacility; 
} 

}

池被傳遞到細節編輯控制器,以便它知道的池它正在編輯。

現在用戶單擊池信息的單個位(例如名稱)並彈出詳細視圖控制器。它允許編輯各個屬性。

很有趣的性質是這樣的:

@property (nonatomic, retain) PoolFacility *thePoolFacilityCopy; 

@屬性(非原子,分配)PoolFacility * thePoolFacility;

它創建一個副本以便在用戶更改值然後取消時進行編輯。如果用戶按下保存,則將副本中的值複製到非副本中。

- (void)viewWillAppear:(BOOL)animated { 

PoolFacility *poolCopy = [self.thePoolFacility copy]; 
self.thePoolFacilityCopy = poolCopy; 
[poolCopy release]; 

}

如果保存或取消被按壓被彈出的圖。

然後我們又回到了顯示所有領域的中間視圖。

現在,如果用戶按下保存我只是poptheviewcontroller,我們又回到了列表視圖。或者如果用戶按下取消我運行這個方法。

-(void)cancel { 

[self.pools removeObject:self.thePoolFacility]; 
[self.navigationController popViewControllerAnimated:YES]; 

}

所以總結

我整個不同的視圖控制器分配屬性,而不是保留它。

而且我的視圖控制器只加載一次,當他們「dissapear」

我希望這使得一些感覺,不會取消!我的問題是..這是做這件事的好方法嗎?

感謝,

回答

2

我沒有看到一個具體的問題在這裏,所以我就做一些一般性的批評。

  1. 在iPhone OS中,取消按鈕在用於添加新項目的對話框上很常見,但在編輯對話框中卻少得多。實際上,編輯對話框上的「取消」按鈕的唯一示例就是時鐘應用程序的「警報」面板。因此,不要擔心複製PoolFacility並在保存時將更改複製回來;只需使「取消」按鈕僅對新對象可見(或使用「廢紙簍」圖標 - 取消新的存儲池並刪除現有存儲池實際上與現在設計的方式相同)。

  2. 正如你現在擁有的東西,有沒有在錯誤的時間被釋放對象的危險。但是,如果您更改存儲方法 - 例如,讓應用程序懶洋洋地從磁盤加載PoolFacility對象 - 它會回來咬你。今天寫得很好,明天你就可以節省自己的痛苦。正確的方法是將PoolFacility設置爲保留屬性,並在您的dealloc方法中釋放它。 (如果你按照你現在的方式管理池列表,你應該這樣做。)

  3. 說到這一點,你不會顯示如何加載現有PoolFacility對象。他們來自哪裏?如果有某種數據庫訪問的事情,你會發現它有幫助的時候被創建,更新或刪除的對象PoolFacility發送通知,然後觀察,並根據需要作出反應,相應的通知。我寫的所有存儲用戶數據的應用都採用這種方法;我發現它非常方便和靈活。

  4. 由於只有一個池列表,它是由多個控制器需要的,有一個在其存儲在您的應用程序委託,而不是周圍的傳遞沒有羞恥。更好的是,編寫一個管理列表的FacilityList單例對象。這可以讓你從你的控制器中獲取很多邏輯。一般來說,除了與屏幕交互的東西外,您應該將所有可以放入模型的東西都放入模型中。這意味着當Apple製作iTablet或發佈Apple TV SDK時 - 或者當您決定製作Mac版或重做用戶界面時 - 您可以通過未經修改的方式儘可能多地提供您的應用程序。

+0

謝謝布倫特。是否有任何聯機代碼示例以上述方式顯示通知的使用? – 2009-02-14 16:30:39