2010-09-07 87 views
0

最近我加入了兩個Xcode項目。爲了讓這個東西起作用,我必須分配並初始化我的視圖控制器。何時分配和初始化視圖控制器

self.myViewController = [[MyViewController alloc] init]; 

但是爲什麼?在另一個項目中,我擁有相同的代碼。唯一的區別是不同視圖的層次結構。我在頂部添加了一個新視圖(開始)。因此,調用View Controller不再是堆棧中的第一個視圖。

我推着以這種方式在棧上我的看法:

[[self navigationController] pushViewController:myViewController animated:YES]; 

在我的發鈔銀行我已經加入IB視圖控制器對象和連接奧特萊斯。

而且我有一個內存管理問題太:如果我有像myViewController屬性,我必須釋放它嗎? 「正常」版本是在dealloc方法中完成的。但是,我必須使用額外的版本嗎?我不這麼認爲,但我仍然問你。

回答

0

我需要看到更多的代碼來回答爲什麼你必須分配你的視圖控制器,但我會說你總是手動分配它們(至少在我的經驗)。

至於內存管理問題,如果你的屬性被聲明爲retain屬性(@property(retain) UIViewController *myViewController),你確實在泄漏內存,因爲alloc後的保留數爲1,並且在你的訪問器完成保留之後因此,如果你只釋放一次,你最終會泄漏。

我經常這樣做,而不是:

self.myViewController = [[[MyViewController alloc] init] autorelease]; 
+1

謝謝您的回答!沒有任何代碼在後面。我完全用IB來完成它,因爲我對使用arrayWithObject感到困惑:viewControllers/pushViewController/addSubView/initWithNibName ...所以要麼釋放它兩次,要麼使用autorelease? – testing 2010-09-07 15:27:54

0

我發現它:在IB我不得不在我的視圖控制器對象上設置筆尖名稱。那麼分配和初始化是由IB完成的?

0

還有一個選項:

(IBAction)loginButton:(UIButton *)sender { 
    NSLog(@"pressed login"); 
    ICMasterViewController *controller = [[self storyboard] instantiateViewControllerWithIdentifier:@"mainnav"]; 
    [self presentViewController:controller animated:YES completion:nil]; 
} 

在你的故事板,你必須有UIViewController與名mainnav