2010-07-06 42 views
0

配方例如如何知道誰將取得所有權?

RecipeAddViewController *addController = [[RecipeAddViewController alloc] 
        initWithNibName:@"RecipeAddView" bundle:nil]; 
addController.delegate = self; 

Recipe *newRecipe = [NSEntityDescription 
        insertNewObjectForEntityForName:@"Recipe" 
        inManagedObjectContext:self.managedObjectContext]; 
addController.recipe = newRecipe; 

UINavigationController *navigationController = [[UINavigationController alloc] 
        initWithRootViewController:addController]; 
[self presentModalViewController:navigationController animated:YES]; 

[navigationController release]; 
[addController release]; 
  1. presentModalViewController和initWithRootViewController都保留自己的論點,並採取所有權。然後釋放兩個對象,證明有人獲得了所有權。所以一般來說,我怎麼知道結果中的哪個消息會取得所有權,以釋放相應的對象?

  2. newRecipe未被釋放,因爲託管對象的生命週期與我的業務無關,該聲明是否正確?

UPD: 對不起#2的答案將是它是由addController保留那麼addController的的dealloc釋放。

回答

3

規則,以最簡單的形式是:

如果你保留它,你鬆開。

但是,通過保留,我的意思是「增加保留數」,因此創建一個新對象(除非它是自動釋放的)也算作保留。

所以:

  1. 如果你叫alloc,你鬆開。
  2. 如果您打電話給copy,則將其釋放。
  3. 如果您撥打retain,則將其釋放。

除了這三種情況,你不應該擔心釋放(假設你使用的第三方庫遵循命名約定)。但是,如果必須知道保留的內容以及未保留的內容,可以查看相關課程的文檔。

對於示例:

  1. 工廠方法(如[NSString stringWithFormat:])創建自動釋放對象。作爲一個經驗法則,如果它是一個以類名開頭的類方法,它將返回一個自動釋放對象。

  2. insertNewObjectForEntityForName:inManagedObjectContext:返回自動釋放對象。這是在documentation for NSEntityDescription

  3. 代表幾乎從不保留,以防止保留週期。

  4. 除了代表,你不需要關心課堂上發生了什麼。如果你通過它的財產,它的工作,如果需要保留或複製它。所有你需要關心的是平衡你的保留和發佈。

1

Cocoa Memory Management rules告訴你所有你需要知道的信息。

回答您的問題:

  1. 你不在乎什麼其他目的釋放方面做/保留。假設他們遵循規則,並且你會沒事的(或者它是代碼中的錯誤)。

  2. 您不應該釋放newRecipe,因爲您沒有使用new,alloc或包含副本的方法獲取它。你也沒有保留它。

+0

尼斯提醒有關'新'。不知道是否有人使用它。 – 2010-07-06 11:36:22