我无法理解为什么过渡事物永远不会像记忆方面那样有效。 这就是我所知道的,如果我错了,请纠正我:
每次切换到新的视图控制器,并删除前一个,无论如何,使用ARC,系统应释放以前控制器的所有内存,包括视图,实例变量,数组和几乎任何其他内容。(不使用webView)
嗯,它似乎永远不会接近那个,而且我总是积累在内存中,这意味着每个视图大约需要30M,而当前后切换时它会在一段时间后变为130。 为什么????还有什么可以做的,确保一切都是免费的? EVINGYTHING?
这就是我如何替换使用storyboard创建的视图,并且有一个名称: (它们都有带图像的滚动视图,切换时应该删除)
UIViewController *mainV=[self.storyboard instantiateViewControllerWithIdentifier:@"AlbumView"];
mainV.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:mainV animated:YES completion:^(void)
{
scroller.delegate=nil;
scroller=nil;
[scroller removeFromSuperview];//should remove the main memory consumer!
[self.view removeFromSuperview];
}];
答案 0 :(得分:1)
presentViewController
不删除任何内容。它在当前的顶部上添加了 new 视图控制器。如果你继续这样做,你最终会得到一堆一英里高的视图控制器,并且内存消耗要匹配。
你需要查看一个不同的结构,可能是一个自定义的容器视图控制器,当你执行某些操作时替换它的子视图控制器,但不知道你想要做什么我不能提供更多建议。
答案 1 :(得分:0)
将行[scroller removeFromSuperview];
放在scroller=nil
之前。
答案 2 :(得分:0)
我的问题的解决方案非常简单,如果我想从A到B,我会这样做:
[self presentViewController:mainV animated:YES completion:^(void)
{
//dont remove your views here
}];
请勿从A中删除我的观点。
比,我想从B回到A:
[self dismissViewControllerAnimated:YES completion:^(void)
{
[allImageView removeAllObjects];
[imagesAreLoadingNow removeAllObjects];
[mainData removeAllObjects];
[scroller removeFromSuperview];
scroller=nil;
scroller.delegate=nil;
[stripView removeFromSuperview];
}];
这将完全从堆栈中删除B.
无需使用委托或其他内容,因为我仍然可以让1个根视图保留在堆栈中。