4

我刚刚开始 iOS 编程,并且正在尝试以编程方式切换视图控制器(即从一个视图转到另一个视图)。我知道呈现下一个视图控制器的视图控制器需要在呈现另一个视图控制器后释放,但我似乎无法得到任何有效的东西。在展示下一个控制器后,我尝试关闭控制器,但我仍然遇到内存泄漏。

所以我有这个代码ViewControllerA

- (void) switchViews {
    [self presentViewController:[[ViewControllerB alloc] init] animated:NO completion:nil];
}

这在ViewControllerB

- (void) switchViews {
    [self presentViewController:[[ViewControllerA alloc] init] animated:NO completion:nil];
}

视图中的按钮触发这些事件,基本上它们只是从一个视图切换到另一个视图。

那么如何来回切换视图以免造成内存泄漏呢?作为旁注,我正在使用ARC。

4

2 回答 2

3

基本上,您在上面的代码中所做的是创建 ViewController A,然后是 ViewControllerB,然后是另一个 ViewController A,然后是另一个 ViewController B,然后是另一个 ViewController A,然后是另一个 ViewController B。

你应该做的是从 ViewController A 开始,创建 ViewController B,然后回到 ViewController A,关闭 Viewcontroller B。

阅读此博客以获取有关如何以我已解释的简单方式进行操作的建议。

现在,使用这种方法有可能会导致一些问题,并且它们很可能只会在您想要做更多的事情而不是仅仅关闭当前的 ViewController 时发生。苹果确实在他们的文档中声明:

“当需要关闭呈现的视图控制器时,首选方法是让呈现的视图控制器解除它。换句话说,只要有可能,呈现视图控制器的同一个视图控制器也应该负责解除它。虽然有几种技术可以通知呈现视图控制器其呈现的视图控制器应该被解除,首选技术是委托。”

现在,正如@LeoNatan 的回答所说,使用[self dismissViewControllerAnimated:completion:. 上面的段落就是为什么,我相信,他说这是一个坏主意。

学习如何以两种方式做到这一点确实是一种很好的做法。虽然我的回答是快速的方法,但它也有点脏。

于 2013-08-11T19:00:23.020 回答
1

这对你来说应该是一个很好的练习,学习 Objective C 和设计模式。

使用“viewControllerBDidClose:”方法创建一个 ViewControllerBDelegate 协议。在 ViewControllerB 中创建一个名为“delegate”的属性。现在,在 vcA 中创建 vcB 后,将委托对象设置为 vcA。现在,当您想从 vcB 回到 vcA 时,您应该通知代理您希望关闭 vcB。然后 vcA 将“dismissViewController:animated:”vcB。

这种设计模式称为委托,并在对象与其委托之间提供双向“对话”。委托使用公共 API 与对象“对话”,而对象使用委托协议与其委托“对话”。

在评论中,有人建议您将 vcB 从其自身中解散。这是一种不好的做法,从不推荐。谁提出了一个视图控制器,谁就应该把它解散。通过委派的方式,您通知演示者演示已完成,演示者应解除演示。

于 2013-08-11T18:47:39.127 回答