presentViewController内存泄漏

时间:2013-08-11 18:19:30

标签: ios uiviewcontroller

我刚刚开始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。

2 个答案:

答案 0 :(得分:3)

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

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

请阅读this blog,了解如何以我所解释的简单方式进行操作。

现在,有可能使用这种方法会导致一些问题,并且很可能只有在你想要做的不仅仅是解除当前的ViewController时才会发生。事实上苹果确实在他们的文档中说明了这一点:

  

“当解雇一个呈现的视图控制器时,首选方法是让呈现视图控制器忽略它。换句话说,只要有可能,呈现视图控制器的同一个视图控制器也应该负责解雇尽管有几种技术可以通知呈现视图控制器,但是它的呈现视图控制器应该被解除,但首选技术是委托。“

现在,正如@LeoNatan的回答所说,使用[self dismissViewControllerAnimated:completion:来做这件事可能是不好的做法。以上段落就是为什么,我相信他说这是一个坏主意。

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

答案 1 :(得分:0)

这对你来说应该是一个很好的练习,研究目标C和设计模式。

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

此设计模式称为委托,并在对象及其委托之间呈现双向“对话”。委托使用公共API与对象“交谈”,而对象使用委托协议与其委托“交谈”。

在评论中,有人建议你自己解雇vcB。这是一种不好的做法,绝不推荐。提出视图控制器的人应该是解雇它的人。通过委派方式,您通知演示者演示文稿已完成,并且演示者应该忽略演示文稿。

相关问题