内存未在iOS 5.1中使用ARC和故事板发布

时间:2012-05-11 02:00:04

标签: iphone ios xcode storyboard automatic-ref-counting

我正在用我的应用程序解决内存问题,该应用程序工作正常,但它会在达到低内存警告时崩溃,并且在使用它10至20分钟时非常非常滞后。

编辑:如何poptoviewcontroller?

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

如何弹回mainView控制器?

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

我的故事板附带的流程:

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

介绍视频 - >欢迎观点&教程视图(如果用户名!存在) - >主视图控制器

这是用户总是去的主要文件。

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

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

我正在使用自定义segue来弹出viewcontrollers,这解决了部分问题。

-(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。

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

3 个答案:

答案 0 :(得分:3)

计算机辅助分析是解决这个问题的方法。建立并分析并解决所有问题。在Leaks and Allocations工具下运行您的应用程序。 Use heap-shot analysis.

答案 1 :(得分:3)

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

在大多数故事板中,您没有看到右侧子视图中的segue循环回到父视图的左侧(并且您的屏幕快照显示了令人眼花缭乱的segue数量回到主视图控制器中,有点红旗)。这是Ray Wenderlich的一个更为习惯的故事板(取自Beginning Storyboards in iOS 5):

Sample storyboard from Ray Wenderlich Tutorial 通常你会用以下内容忽略子视图,而不是使用segue。

[self.navigationController popViewControllerAnimated:YES];

如果您想要弹出多个级别,可以使用popToViewControllerpopToRootViewControllerAnimated。或者如果你使用模态segues,你会用dismissViewControllerAnimated忽略模态。

如果我误解了“自定义流行”的意思,你能提供你正在使用的代码吗?

答案 2 :(得分:2)

  1. @ ken-thomases分析正在进行中。另请参阅Finding leaks

  2. 我认为你正在使用ARC?

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

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