我意識到有類似這樣的很多問題,但通過相當多的人已經看內存管理,我仍然缺乏信心,知道我在做什麼是正確的。我很抱歉,如果這個問題是多餘的,但是我真的很想明確我在做什麼是不壞的做法......以編程方式創建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,但我想保留一個對象的引用,因爲我需要在代碼中的其他地方。處理這個問題的正確方法是什麼?
謝謝!
謝謝!然而,我有一個澄清問: 在此之前行:settingsViewController = [[SettingsViewController的alloc] initWithNibName:@ 「SettingsViewController」 束:無]; 由於@property(retain),wouldnt保留計數已經是1?那麼按照上面的alloc,保留數不會變成2嗎? – kurisukun 2012-02-09 04:06:02
在這個特定的實例中,當您分配並初始化settingsViewController時,不會調用該屬性。如果你已經使用'self.settingsViewController = [[SettingsViewController alloc] initWithNibName:@「SettingsViewController」bundle:nil];'你會是對的,保留計數是2。您在分配時將您的控制器視爲正常的伊娃,但在釋放時將其視爲伊娃和財產。 – 2012-02-09 04:38:02
謝謝!我沒有意識到關於self.settingsViewController。如果我可以問,在這種情況下哪種方法是正確的?我應該如上圖所示,還是完全不同的東西? – kurisukun 2012-02-09 08:27:20