【问题标题】:when to alloc and initialize a view controller何时分配和初始化视图控制器
【发布时间】:2010-09-07 13:37:51
【问题描述】:

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

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

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

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

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

在我的 NIB 中,我添加了一个带有 IB 的 View Controller 对象并连接了 Outlets。

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

【问题讨论】:

    标签: iphone objective-c cocoa-touch xcode


    【解决方案1】:

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

    至于内存管理问题,如果您的属性被声明为retain 属性(@property(retain) UIViewController *myViewController),您确实在泄漏内存,因为分配后的保留计数将为 1,并且在您完成保留后访问器将是 2。因此,如果您只释放一次,您最终会泄漏。

    我通常这样做:

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

    【讨论】:

    • 感谢您的回答!后面没有代码了。我完全用 IB 来做这件事,因为我对使用 arrayWithObject:viewControllers/pushViewController/addSubView/initWithNibName 感到困惑......所以要么释放它两次,要么使用自动释放?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      还有一个选择:

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

      在你的故事板上你必须有UIViewController 和名字mainnav

      【讨论】:

        猜你喜欢
        • 2012-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-06
        • 2011-01-14
        • 1970-01-01
        • 2010-10-24
        相关资源
        最近更新 更多