2012-02-10 262 views
0

今天我做了一些测试,我很好奇的结果。我做了一个应用程序(ARC),它有UINavigationController和两个UIViewControllers。在第一个视图中有一个按钮,当按下该按钮时,将加载第二个视图。在第二个视图中,当检测到摇晃手势时,加载第一个视图,依此类推。我在文书中注意到,每次加载视图时,堆都会增长。下面是一些代码堆内存越来越大

AppDelegate.m

self.navigationController = [[UINavigationController alloc]init]; 
self.window setRootViewController:self.navigationController]; 
FirstViewController *firstview = [FirstViewController alloc]init]; 
[self.navigationController pushViewController:FirstViewController animated:YES]; 

FirstViewController.m

-(IBAction)loadSecondView 
{ 
    SecondViewController *secondview = [SecondViewController alloc]init]; 
    [self.navigationController pushViewController:secondview animated:YES]; 
} 

SecondViewController.m

-(IBAction)loadFirstView 
{ 
    FirstViewController *firstview = [FirstViewController alloc]init]; 
    [self.navigationController pushViewController:first view animated:YES]; 
} 

我想不通,为什么出现这种情况。在这种情况下如何避免堆积如山?

+0

在你的第二个的viewController有将已经后退按钮,当你点击就可以了,所以没必要实施loadFirstView method.because每次你被creatng FirstViewController的新实例时自动工作,这就是为什么内存堆中成长每次。 – 2012-02-10 08:55:57

+0

我不想那个按钮。我想在检测到摇晃手势时工作。 – objlv 2012-02-10 08:58:43

+0

摇:[self.navigationController popViewControllerAnimated:YES]; – NeverBe 2012-02-10 09:09:38

回答

1

其实每次你创建一个新的视图控制器对象的时间..这不应该做的。

所以每次分配一个新对象,并推动这一观点的时候,它会被添加到导航栈,因此,存储的增长。

相反,当您处于第一个视图并点击该按钮时,您可以弹出当前视图控制器并通知AppDelegate类显示第二个视图。

同样在第二个视图中,当您想要显示第一个视图时,弹出当前视图并通知AppDelegate类推入第一个视图控制器。

+0

你能告诉我一些简单的例子吗? – objlv 2012-02-10 09:05:11

0
SecondViewController *secondview = [[[SecondViewController alloc]init] autorelease]; 

FirstViewController *firstview = [[[FirstViewController alloc]init] autorelease]; 

如果第二控制器打开第一,你应该自动释放viewcontrollers(不ARC)

,你应该做的popViewController。如果你不会回国了堆将增长