【问题标题】:ipad app crashes on new iOS 4.1.2 but works on 3.2ipad 应用程序在新的 iOS 4.1.2 上崩溃,但在 3.2 上运行
【发布时间】:2011-01-19 16:13:06
【问题描述】:

我有一个应用程序,我可以在其中播放启动视频并添加了一些自定义字体。

该应用程序在 ipad 3.2 上运行良好,但在 4.2 等上它会崩溃。日志说我发布了一些我力图分配的东西。我已经检查了我的代码一百次,我没有做任何这样的事情。

无论是在模拟器上还是在设备上(都是 3.2)

有什么想法吗?

编辑:

<Error>: df(7903,0x3e3d7898) malloc: *** error for object 0x1a11b0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Wed Jan 19 20:35:38 unknown UIKitApplication:com..imagazine[0x9c7c][7903]                         <Notice>: def(7903,0x3e3d7898) malloc: *** error for object 0x1a11b0: pointer being           freed was not allocated
 Wed Jan 19 20:35:38 unknown UIKitApplication:com.imagazine[0x9c7c][7903] <Notice>: *** set a breakpoint in malloc_error_break to debug
   Wed Jan 19 20:35:39 unknown ReportCrash[7905] <Notice>: Formulating crash report for process df[7903]
  Wed Jan 19 20:35:39 unknown com.apple.launchd[1] <Warning>: (UIKitApplication:com.imagazine[0x9c7c]) Job appears to have crashed: Abort trap
  Wed Jan 19 20:35:39 unknown SpringBoard[27] <Warning>: Application 'df' exited abnormally with signal 6: Abort trap
  Wed Jan 19 20:35:39 unknown ReportCrash[7905] <Error>: Saved crashreport to /var/mobile/Library/Logs/CrashReporter/df_2011-01-19-203538_Sumas-iPad.plist using uid: 0 gid: 0, synthetic_euid: 501 egid: 0

解决方案:

首先使用 NSZombies,你会发现这样的错误。

问题:我每 0.2 秒设置一个计时器,它正在清除 UIView 并分配它,不是每 0.2 秒,而是每 5 秒一次。 我做了一个标准检查:

  if(vewCustom!= nil) {
      [vewCustom removeFromSuperView];
      [vewCustom release];
      vewCustom = nil;
   }

但奇怪的是,我验证了代码数百次,但我并没有过度发布,无论它在 iOS4.2 for iPhone 上如何工作。

我删除了 Timer,但它仍然崩溃,然后我删除了版本,现在它可以正常工作了。

很奇怪,但如果有人能解释我做错了什么就好了。

【问题讨论】:

  • 向我们展示你的崩溃报告中关于崩溃线程的回溯。也是报告中显示的异常类型。
  • 它“工作”并不重要。错误的代码有时会起作用。您是如何创建 vewCustom 的?您是否在超级视图拥有的参考之外持有参考? vewCustom 是不是带有 retain 的属性?
  • 是的,它有一个保留属性,是的,它在超级视图之外有一个引用。但我检查了是否为 nil,然后才释放它。
  • 检查 nil 没有帮助。您可以查看retainCount,但这并不能告诉您自动释放是否处于挂起状态。我认为构建和分析会给你一个线索。

标签: ipad ios4 memory-leaks


【解决方案1】:

您可以尝试在启用僵尸的情况下在调试中运行该应用。通过这种方式,您将获得有关过度释放对象的堆栈跟踪,这是有关如何设置它的链接。

http://iosdevelopertips.com/debugging/tracking-down-exc_bad_access-errors-with-nszombieenabled.html

【讨论】:

  • 感谢我能够发现错误。但这太疯狂了,因为我没有两次发布版本。
【解决方案2】:

假设日志为真。找到它的最简单方法是启用 Zombies,然后彻底运行您的应用程序。见这里(提示 #1):

http://loufranco.com/blog/files/debugging-memory-iphone.html

要做的另一件事是构建和分析并查看它标记的每一件事。根据我的经验,很少有误报。

【讨论】:

  • 感谢我能够发现错误。但这太疯狂了,因为我没有两次发布版本。
  • 你是否释放了一些你不应该释放的东西,因为它是在自动释放完成后返回的?
【解决方案3】:

只是在寻找其他东西时注意到了这一点。崩溃的原因是removeFromSuperview导致superview释放视图。因此,随后的发布是多余的(过度发布)。 ARC 不会有问题,但在其他情况下可能会引起一些混乱

【讨论】:

  • 不是真的 Scott,removeFromSuperview 会将保留计数减少 1,但除非我在子视图上调用释放或自动释放,否则这将是内存泄漏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
相关资源
最近更新 更多