Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 何时分配和初始化视图控制器_Iphone_Objective C_Cocoa Touch_Xcode - Fatal编程技术网

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

Iphone 何时分配和初始化视图控制器,iphone,objective-c,cocoa-touch,xcode,Iphone,Objective C,Cocoa Touch,Xcode,最近我加入了两个Xcode项目。为了让它工作,我必须分配并初始化我的视图控制器 self.myViewController = [[MyViewController alloc] init]; 但是为什么呢?在另一个项目中,我有相同的代码。唯一的区别是不同视图的层次结构。我在顶部(开始)添加了一个新视图。因此,调用视图控制器不再是堆栈上的第一个视图 我以这种方式在堆栈上推送我的视图: [[self navigationController] pushViewController:myViewC

最近我加入了两个Xcode项目。为了让它工作,我必须分配并初始化我的视图控制器

self.myViewController = [[MyViewController alloc] init];
但是为什么呢?在另一个项目中,我有相同的代码。唯一的区别是不同视图的层次结构。我在顶部(开始)添加了一个新视图。因此,调用视图控制器不再是堆栈上的第一个视图

我以这种方式在堆栈上推送我的视图:

[[self navigationController] pushViewController:myViewController animated:YES];
在我的NIB中,我添加了一个带有IB的视图控制器对象,并连接了插座


我还有一个内存管理问题:如果我有一个像myViewController这样的属性,我必须释放它吗?“正常”释放是通过dealloc方法完成的。但是由于alloc,我必须使用额外的版本吗?我不这么认为,但我还是问你。

我发现了:在IB中,我必须在我的视图控制器对象上设置nib名称。因此,alloc和初始化是由IB完成的?

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

至于内存管理问题,如果您的属性被声明为
retain
属性(
@property(retain)UIViewController*myViewController
),您确实在泄漏内存,因为alloc之后的retain计数将为1,而访问器执行retain之后的retain计数将为2。因此,如果只释放一次,最终将导致泄漏

我通常会这样做:

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

还有一个选择:

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

在故事板上,您必须有名为
mainnav

UIViewController
,谢谢您的回答!后面不再有代码了。我完全是用IB来做的,因为我对使用arrayWithObject感到困惑:ViewController/pushViewController/addSubView/initWithNibName。。。那么要么释放两次,要么使用自动释放?