我刚刚开始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。
发布于 2013-08-11 19:00:23
基本上,您在上面的代码中所做的是创建ViewController A,然后是ViewControllerB,然后是另一个ViewController A,然后是另一个ViewController B,然后是另一个ViewController A,然后是另一个ViewController B。
您应该做的是从ViewController A开始,创建ViewController B,然后返回到ViewController A,只需取消视图控制器B。
请阅读这个博客,了解如何以我已经解释过的简单方式进行操作的建议。
现在,使用这种方法可能会导致一些问题,而且它们很可能只在您想要做的不仅仅是忽略当前的ViewController时才会发生。事实上,苹果在他们的文档中是这样说的:
“当涉及到解散呈现视图控制器的时候,首选的方法是让呈现视图控制器放弃它。换句话说,只要有可能,提交视图控制器的同一视图控制器也应该负责取消它。虽然有几种技术可以通知呈现视图控制器其呈现的视图控制器应该被排除,但首选的技术是委托。”
现在,正如@LeoNatan的回答所说,使用[self dismissViewControllerAnimated:completion:来实现这一点可能是错误的做法。以上一段就是为什么,我相信,他说这是个坏主意。
学习两种方法都是很好的做法。虽然我的回答是快速的方法,但它也是有点脏。
发布于 2013-08-11 18:47:39
这对你来说应该是一个很好的练习,学习目标C和设计模式。
使用“ViewControllerBDelegate:”方法创建一个viewControllerBDidClose协议。在ViewControllerB中创建一个名为“委托”的属性。现在,在vcA中创建vcA之后,将委托对象设置为vcA。现在,当您想从vcA返回到vcB时,应该通知委托您希望关闭vcB。然后,vcA会“解雇视图控制器:动画:”vcB。
这种设计模式称为委托,并呈现对象与其委托之间的双向“会话”。委托通过使用公共API与对象“会话”,而对象使用委托协议与其委托进行“会话”。
在评论中,有人建议您将vcB从自身中排除在外。这是一个不好的做法,从来没有被推荐。提出视图控制器的人应该是拒绝它的人。以委托的方式,您通知推荐人提交人已经完成,并且推荐人应驳回提交人。
https://stackoverflow.com/questions/18175152
复制相似问题