3

我正在为我的应用程序的内存问题而苦恼,该应用程序运行良好,只是一旦它遇到内存不足警告就会崩溃,并且在使用 10 到 20 分钟时非常非常缓慢。

编辑:如何弹出视图控制器?

introvideo-> welcomeview & tutorialview-> mainviewcontroller->scannerviewcontoller-> questionview->(如果回答正确->正确视图) else->wrongView

我如何弹回 mainView 控制器?

下面的代码是解决将视图控制器添加到 navigationcontroller.viewcontroller 堆栈的问题。因为我正在使用情节提要从视图控制器推送到另一个视图控制器而没有弹出。代码将弹出到已经在视图控制器堆栈中的视图控制器。

附上我的故事板的流程:

http://dl.dropbox.com/u/418769/storyboard%20flow.png

介绍视频 -> 欢迎视图和教程视图(如果用户名 !exist)-> 主视图控制器

这是用户将始终访问的主文件。

http://dl.dropbox.com/u/418769/scannerViewController.h

http://dl.dropbox.com/u/418769/scannerViewController.m

我正在使用自定义 segue 来弹出视图控制器,这解决了部分问题。

-(void)perform {
    UIViewController *sourceVC = (UIViewController *) self.sourceViewController;
    NSInteger index = -1;
    NSArray* arr = [[NSArray alloc] initWithArray:sourceVC.navigationController.viewControllers];
    for(int i=0 ; i<[arr count] ; i++)
    {
        if([[arr objectAtIndex:i] isKindOfClass:NSClassFromString(@"mainViewController")])
        {
            index = i;
        }       
    }    

    [UIView transitionWithView:sourceVC.navigationController.view duration:0.5
                       options:UIViewAnimationOptionTransitionCrossDissolve
                    animations:^{

                        [sourceVC.navigationController popToViewController:[arr objectAtIndex:index] animated:NO];

                    }
                    completion:^(BOOL  completed)
     {     

             }                      
     ];

}

但是,该应用程序仍在消耗 RAM 和 VRAM。

我真的很感谢这里的任何朋友帮助解决我的问题,是否强大的价值导致了这个问题?

4

3 回答 3

3

计算机辅助分析是解决这个问题的方法。构建和分析并解决所有问题。在 Leaks and Allocations 工具下运行您的应用程序。使用堆分析。

于 2012-05-11T05:24:05.930 回答
3

当您说您正在使用“自定义 segue 弹出到主视图控制器”时,我不确定我是否完全理解这一点。你在用performSegueWithIdentifier吗?如果是这样,那么您就不会弹出;您正在推送主视图控制器的另一个副本!

在大多数情节提要中,您不会看到右侧子视图的转场循环回到父视图的左侧(并且您的屏幕快照显示转场返回主视图控制器的数量令人眼花缭乱,这有点一面红旗)。这是 Ray Wenderlich 的一个更习惯的故事板(取自iOS 5 中的开始故事板):

Ray Wenderlich 教程中的示例故事板
(来源:cloudfront.net

通常,您会使用以下内容关闭子视图,而不是使用 segue。

[self.navigationController popViewControllerAnimated:YES];

其中,如果您想弹出多个级别,您可以使用popToViewControlleror popToRootViewControllerAnimated。或者如果你使用模态序列,你会用dismissViewControllerAnimated.

如果我误解了你所说的“自定义 segue to pop”的意思,你能提供你正在使用的代码吗?

于 2012-05-12T15:12:32.780 回答
2
  1. @ken-thomases 分析很到位。另请参阅查找泄漏

  2. 我想你正在使用ARC?

  3. 你能解释一下上述代码示例的目的是什么,以及你的应用程序正在做什么来要求这样的东西吗?感觉就像你在解决一个症状而不是解决一个问题。

  4. 在回答您的问题时,除非您有强大的参考周期strong,否则使用不太可能成为问题的根源(请参阅过渡到 ARC)。如果您遵循 Ken 的建议,您将确定您的应用程序在哪里泄漏内存(假设是),如果是,它在哪里。到那时,如果您仍然不了解泄漏的来源,您可以在这里发布违规代码,我相信会有很多人愿意提供帮助。此外,如果您有一些代码不知道引用是否不合适,请发布相关代码,我相信如果可以的话,我们会很乐意提供帮助。strong

于 2012-05-11T06:02:12.070 回答