2

在多个 UIViewController 一起工作的应用程序中,

firstViewController添加到根目录。到这里还好,现在我想去secondViewController我不想使用UINavigationControllerUITabBarController。我已经阅读了View Controller Programming Guide,但它没有指定不使用UINavigationController, UITabBarController and story board.

而当用户想要从哪里移动secondViewController到哪里firstViewControllersecondViewController被销毁呢?

Apple Doc 也没有指定 UIViewController 是如何释放或销毁的?它只告诉里面的生命周期UIViewController

4

4 回答 4

2

如果您担心UIViewController是如何释放或销毁的,那么这里有一个适合您的场景:-

这是FirstViewController中呈现SecondViewController的按钮点击方法(使用 pushViewController、presentModalViewController 等)

在 FirstViewController.m 文件中

- (IBAction)btnTapped {

    SecondViewController * secondView = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
    NSLog(@"Before Present Retain Count:%d",[secondView retainCount]);
    [self presentModalViewController:secondView animated:YES];
    NSLog(@"After Present Retain Count:%d",[secondView retainCount]);
    [secondView release];  //not releasing here is memory leak(Use build and analyze)
}

现在在 SecondViewController.m 文件中

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"View Load Retain Count %d",[self retainCount]);
  }

- (void)dealloc {
    [super dealloc];
    NSLog(@"View Dealloc Retain Count %d",[self retainCount]);
 }

运行代码后:

推送前保留计数:1
查看加载保留计数 3
推送后保留计数:4
查看 Dealloc 保留计数 1

如果您正在分配和初始化 ViewController,您是其生命周期的所有者,您必须在push 或 modalPresent之后释放它。在上面的输出中,在分配初始化时 SecondViewController 的保留计数是一个,但在逻辑上它的保留计数仍然是一个,即使它已经被释放(参见 dealloc 方法),所以需要在 FirstViewController 中释放以完全销毁它.

于 2013-05-02T10:30:23.557 回答
1

呈现新视图控制器的另一种方法是像模态视图控制器一样进行操作(注意 self 是 firstViewController):

[self presentModalViewController:secondViewController animated:YES];

然后,当你想回到 firstViewController 并销毁 secondViewController 时,你必须关闭视图控制器(从 secondViewController):

[self dismissModalViewControllerAnimated:YES];

希望有帮助。

于 2013-05-02T08:51:44.640 回答
1

您可以使用 UINavigationController 移动到 secondViewController 并通过将 UINavigationController 属性“navigationBarHidden”设置为 YES 来返回。这将隐藏导航栏。视图控制器的释放和销毁将为此负责。

于 2013-05-02T09:27:42.833 回答
0

然后,您可以采取其他策略,不是最好的构建您的视图控制器层次结构,但它也可以工作。您可以将 secondViewContrller 的视图覆盖在 firstViewController 上,并使 secondViewController 成为 firstViewController 的子视图:

//...
[self addChildViewController:secondViewController];
[self.view addSubview:secondViewContrller.view];
//...

而当你想删除视图控制器时,你必须删除视图并要求视图控制器从他的父级中删除:

//...
[self.view removeFromSuperview];
[self removeFromParentViewController];
//...

但是你必须自己控制视图层次结构(自己放置和删除视图和视图控制器)。

于 2013-05-02T09:42:20.610 回答