何时分配和初始化视图控制器

问题描述:

最近我加入了两个Xcode项目。为了让这个东西起作用,我必须分配并初始化我的视图控制器。何时分配和初始化视图控制器

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

但是为什么?在另一个项目中,我拥有相同的代码。唯一的区别是不同视图的层次结构。我在顶部添加了一个新视图(开始)。因此,调用View Controller不再是堆栈中的第一个视图。

我推着以这种方式在栈上我的看法:

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

在我的发钞银行我已经加入IB视图控制器对象和连接奥特莱斯。

而且我有一个内存管理问题太:如果我有像myViewController属性,我必须释放它吗? “正常”版本是在dealloc方法中完成的。但是,我必须使用额外的版本吗?我不这么认为,但我仍然问你。

我需要看到更多的代码来回答为什么你必须分配你的视图控制器,但我会说你总是手动分配它们(至少在我的经验)。

至于内存管理问题,如果你的属性被声明为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

我发现它:在IB我不得不在我的视图控制器对象上设置笔尖名称。那么分配和初始化是由IB完成的?

还有一个选项:

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

在你的故事板,你必须有UIViewController与名mainnav