【问题标题】:App crashes on regain focus应用程序在重新获得焦点时崩溃
【发布时间】:2013-01-27 06:41:03
【问题描述】:

当我的应用从主页按钮失去焦点后重新打开时,我遇到了一种奇怪的行为。在模拟器上,应用程序屏幕会黑屏 5 秒或更长时间,然后才能恢复应用程序。在测试设备上,应用程序要么进行长时间的延迟,要么完全退出并重置为启动状态。我已将 NSLog 调试 cmets 放在“applicationWillEnterForeground”和“applicationDidBecomeActive”中,但它们只会在长时间延迟后出现,所以我现在假设这些函数中的任何内容都不会导致这种延迟。

我在我的程序中使用以下组件: * 一个标签栏控制器 * 2 个计时器,地图套件 * IP 套接字流 * 24 个 ViewController 串在一个故事板上。 * 不少背景图片和图片按钮

如果我知道程序的哪些部分导致了这个错误,我会很乐意发布代码,但事实上我一无所知。有没有其他人遇到过这种类型的错误?我列出的任何组件是否有导致类似错误的历史记录?

当这个错误被发现时,我的开发还很遥远,我没有在增量开发过程中测试通过主页按钮失去焦点。其他较小的项目(使用套接字和计时器)在相同的测试硬件上没有遇到相同的错误。

我正在使用“applicationWillResignActive”来禁用计时器,并关闭流。我正在使用“applicationDidBecomeActive”重新启动计时器,并重新打开流。延迟发生在“applicationWillEnterForeground”和“applicationDidBecomeActive”运行之前。此外,我尝试禁用启动流和计时器的代码,但这对错误没有任何影响。

我正在使用 xCode4.4.1、ios6,并且专为 iPad 构建。

【问题讨论】:

  • 您拥有的任何设置初始变量的代码都应该在viewDidLoadawakeFromNib ... 听起来您已经将初始变量设置代码放在应用程序时触发的其他内容中“重新获得”焦点...无论您最初是在哪里设置变量,我都会将其移至 viewDidLoad
  • 我忘了说应用在 1 秒内加载完毕,只有重新加载过程会挂起超过 5 秒或完全崩溃

标签: ios objective-c ios6 ios-simulator


【解决方案1】:

调试器可能会在显示您遇到断点以及 applicationWillEnterForeground 的代码执行时与您的大脑开玩笑。我建议您将最新的代码提交到源代码管理并开始一次删除一个部分,直到您看到行为消失为止。

【讨论】:

  • 我担心我不得不这样做,我在这里发帖看看是否有人可以缩小我应该首先删除程序的哪一部分。说到删除,我是否必须删除故事板中的内容,或者我可以让它们无法访问。代码中的类也是如此,我可以注释掉对它的所有引用还是必须完全删除源文件?
  • 就我个人而言,我会首先注释掉计时器和基于代码的对象。我对故事板没有太多经验,但我在我的应用程序中使用了一个技巧来理解视图的状态:在 viewdidload 或另一个“视图生命周期”函数中放置一个断点。然后将其输入调试器“po [[self navigationController] viewControllers]”。这将向您展示所有堆叠的视图控制器。在各个部分执行此操作,看看视图数量是否会影响加载时间
  • 我发现了问题,在applicationWillResignActive上我写了一堆数据到NSUserDefaults。这导致 applicationWillResignActive 在应用程序关闭之前未完成并导致重新加载失败。该应用程序现在可以在禁用 NSUserDefaults 调用的情况下成功重新加载。我打算将此功能移至应用程序运行时用户可以点击的保存按钮。感谢您对 portforwardpodcast 的帮助。
  • 我不是 100% 确定,但我认为阅读默认值非常便宜。您应该阅读现有的默认值并只写入更改的默认值。这可能会减少您避免显式保存按钮所花费的时间
  • 它正在创建一个巨大的 XML 字符串并将其保存为默认值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2015-03-24
相关资源
最近更新 更多