【问题标题】:memory not releasing with ARC and storyboard in iOS 5.1iOS 5.1 中没有使用 ARC 和情节提要释放内存
【发布时间】:2012-05-19 15:24:32
【问题描述】:

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

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

introvideo->welcomeview & tutorialview-> mainviewcontroller->scannerviewcontoller-> questionview ->(如果回答正确 -> correctView) 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。

非常感谢这里的任何朋友帮助解决我的问题,Strong value 是否导致了这个问题?

【问题讨论】:

  • 当 SO 问题中的链接不起作用时,这很烦人。您能否修复它们或将它们从问题中删除?

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


【解决方案1】:

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

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


(来源:cloudfront.net

通常,您会通过以下方式关闭子视图,而不是使用 segue。

[self.navigationController popViewControllerAnimated:YES];

当然,如果您想弹出多个级别,您可以使用popToViewControllerpopToRootViewControllerAnimated。或者,如果您使用模态序列,您将使用 dismissViewControllerAnimated 关闭模态。

如果我误解了您所说的“自定义 segue to pop”不是什么意思,您能提供您使用的代码吗?

【讨论】:

  • 我将自定义 segue 从其他 viewcontroller 链接到 mainviewcontroller,它调用此文件 dl.dropbox.com/u/418769/popToMain.m,然后它将弹回 mainviewcontrol,这是在情节提要中正确的做法吗?
  • 我想它确实有效,尽管它让我觉得不必要的复杂。我会让我的主视图控制器成为根(如果我需要显示欢迎/教程,我会制作那些在你真正需要它的极少数情况下会启动的子视图)。这样,一个简单的 popToRootViewController 将始终为您完成,您可以消除尝试从视图控制器列表中清除欢迎/教程的愚蠢。
  • 我当然会尝试显着简化自定义 segue 并仅使用 popToRootViewController,如我之前的评论中所述,看看这是否能解决您的 RAM 吃紧问题。如果没有,那么您需要回到我们最初的 cmets 使用仪器,看看是否有任何泄漏,或者如果没有,至少看看是什么在消耗您的 RAM。你有没有寻找泄漏/分配呢?你发现了什么?
  • @Desmond,您可以(a)将其作为属性传递给您的 prepareForSegue,(b)将其保存为单例类的属性,或(c)将其保存为您的属性您通过 [UIApplication sharedApplication].delegate 检索的应用程序委托。更好的是,如果您尝试访问主视图控制器,但您担心介绍视图控制器,您可能需要重新排列情节提要,以便主视图控制器实际上是根(当你需要它),因此 popToRootViewController 将永远带你回家。
  • @Desmond 顺便说一句,如果这是一个仅限 iOS 6 的应用程序,您可以使用 unwind segues,这大大简化了这个过程。就个人而言,我还没有准备好放弃 iSO 5 的向后兼容性,但如果你愿意,unwind segues 可以非常优雅地完成工作。
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    1. @ken-thomases 分析很到位。另见Finding leaks

    2. 我想您正在使用 ARC?

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

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

    【讨论】:

    • 嗨@robert,感谢您的回复。是的,我正在使用 ARC 用您的问题编辑了我的问题,我还发布了我的一个代码,所有用户都将通过该代码进行 QR 码扫描。
    • 谢谢。我看到你做了很多 performSegueWithIdentifier 调用。我还看到您的故事板有大量的转场要返回到 主视图控制器。 您是否曾经弹出/关闭各种视图控制器以返回主视图控制器,或者您是只是执行另一个 segue 到达那里。 (如果你在做后者,即你有一组循环的 segue,那可能会耗尽你的记忆。)
    • 我正在使用自定义 segue 弹出到主视图控制器,主视图控制器位于导航视图控制器堆栈中。我将视图弹出回堆栈中与 mainviewcontroller 同名的视图,如我的问题所示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多