【问题标题】:Xcode 4.5 - App crashes from excessive memory usage, works fine on 4.3Xcode 4.5 - 应用程序因内存使用过多而崩溃,在 4.3 上运行良好
【发布时间】:2012-09-20 17:37:45
【问题描述】:

我有一个使用以下代码从视图控制器转换到视图控制器的应用程序:

[self addChildViewController:self.aNewViewController];
    [self transitionFromViewController:self.currentViewController
                      toViewController:self.aNewViewController
                              duration:1.0
                               options:UIViewAnimationOptionTransitionFlipFromBottom
                            animations:nil
                            completion:^(BOOL finished) {
                                [self.aNewViewController didMoveToParentViewController:self];
                                [self.currentViewController removeFromParentViewController];
                                self.currentViewController=self.aNewViewController;
                            }];

当我在 iOS 5.0 设备上使用 Xcode 4.3 运行它时,它运行得非常流畅并且使用了大约 30 - 50 mb。当我在任何设备上使用 Xcode 4.5 运行它时,每次我更改视图控制器时,应用程序都会从​​ 30 - 70 - 100 - 130 mb 跳跃时崩溃。每次我离开视图控制器时似乎都没有释放内存。我正在使用 ARC。

提前感谢您提供的任何帮助。

【问题讨论】:

  • 使用 Instruments 并找出哪些对象没有被释放,然后更新问题。
  • 我使用仪器运行了一个 heapshot 分析,它指向这一行:[self transitionFromViewController: self.currentViewController...etc];几个月来,我一直在使用此代码从一个视图控制器转换到另一个视图控制器 - 没有任何问题。一旦我升级到 4.5,它现在导致我的应用程序由于内存问题而崩溃。知道为什么以及如何解决这个问题吗?

标签: ios xcode memory view uiviewcontroller


【解决方案1】:

在此处涉及的每个视图控制器的 dealloc() 中添加一条日志消息,其中包含一些唯一的字符串,并查看是否有任何参与转换的 VC 被释放。一个或几个没有被释放显然是问题所在。要寻找的是保留周期 - 它们的 ivars/properties 采用委托或保留它的类似参数。例如 NSTimer 保留它发送消息的对象。

如果您能找到这个,解决方案是在您的 VC 中编写一个新方法,通过确保修改这些对象以不保留其所有者(对于 NSTimer,使其无效然后为零)来准备发布。

您可以在转换完成块中发送此新消息。

【讨论】:

  • 谢谢。找到了……一个循环播放的动画,我忘了停下来。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2017-08-09
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多