2012-02-09 71 views
0

我意識到有類似這樣的很多問題,但通過相當多的人已經看內存管理,我仍然缺乏信心,知道我在做什麼是正確的。我很抱歉,如果這個問題是多餘的,但是我真的很想明確我在做什麼是不壞的做法......以編程方式創建viewControllers

簡單地總結一下,我正在做一個工具型應用程序,只爲我的測試。底部有一個UIToolbar按鈕。就行爲而言,當用戶點擊按鈕時,它會在屏幕中間打開一個小的子視圖。實質上,它是一個設置子視圖,用戶可以在其中切換某些設置。如果用戶再次點擊工具欄按鈕,它應該關閉設置子視圖。

無論如何,代碼如下:

//Interface 
@interface ViewController : UIViewController 
{ 
    SettingsViewController *settingsViewController; 
} 
@property(retain, nonatomic) SettingsViewController *settingsViewController; 

這裏是實現:

//Implementation 
-(IBAction)changeSettings:(id)sender 
{ 
    if(!settingsViewController) 
    { 
     settingsViewController = [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:nil]; 

     //Do some stuff here with CGRect to put the subview in the center of the view 

     [self.view addSubview:settingsViewController.view]; 
    } 
    else 
    { 
     [settingsViewController.view removeFromSuperview]; 
     [settingsViewController release]; 
     [self setSettingsViewController:nil]; 
    } 
} 

實際上,現在這段代碼,當我試圖關閉子視圖(它的崩潰如代碼到達上面的else語句時,它崩潰了)。

綜觀上述代碼中,我估計保留可能看起來像這樣:

  • @Property保持在settingsViewController(保留爲1)
  • 上settingsViewController的alloc後(保持爲2)
  • 後addSubview:settingsViewcontroller.view(保留是3)

我想我在這裏做錯了什麼。或者說,我知道我是,因爲它正在崩潰。

我真的希望這是一個好問題。本質上,我想知道如何處理這種情況。我在編程方式分配一個viewcontroller,也做一個addSubiew,但我想保留一個對象的引用,因爲我需要在代碼中的其他地方。處理這個問題的正確方法是什麼?

謝謝!

回答

1

的問題是,你是釋放settingsViewController太多次。

if(!settingsViewController) 
{ 
    settingsViewController = [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:nil]; 
    // [settingsViewController retainCount] should now equal 1 

    [self.view addSubview:settingsViewController.view]; 
} 
else 
{ 
    [settingsViewController.view removeFromSuperview]; 

    [settingsViewController release]; 
    // [settingsViewController retainCount] should now equal 0 

    [self setSettingsViewController:nil]; 
    // [settingsViewController retainCount] should now equal -1. This is most 
    // likely causing your crashes. 
} 

二者必選其一

[settingsViewController release]; 
settingsViewController = nil 

或使用:

[self setSettingsViewController:nil]; 
+0

謝謝!然而,我有一個澄清問: 在此之前行:settingsViewController = [[SettingsViewController的alloc] initWithNibName:@ 「SettingsViewController」 束:無]; 由於@property(retain),wouldnt保留計數已經是1?那麼按照上面的alloc,保留數不會變成2嗎? – kurisukun 2012-02-09 04:06:02

+0

在這個特定的實例中,當您分配並初始化settingsViewController時,不會調用該屬性。如果你已經使用'self.settingsViewController = [[SettingsViewController alloc] initWithNibName:@「SettingsViewController」bundle:nil];'你會是對的,保留計數是2。您在分配時將您的控制器視爲正常的伊娃,但在釋放時將其視爲伊娃和財產。 – 2012-02-09 04:38:02

+0

謝謝!我沒有意識到關於self.settingsViewController。如果我可以問,在這種情況下哪種方法是正確的?我應該如上圖所示,還是完全不同的東西? – kurisukun 2012-02-09 08:27:20