【问题标题】:An Objective-C message was sent to a deallocated object (zombie) at address: 0x75d52a0一条 Objective-C 消息被发送到地址为 0x75d52a0 的已释放对象(僵尸)
【发布时间】:2012-12-06 07:54:07
【问题描述】:

我对 iOS 开发比较陌生,因此感谢您帮助找出我遇到的错误的根本原因。

我尝试使用 Instruments(即 Allocations-Zombie Profiler)调试错误,但无法理解所显示的调用堆栈。

这是用户界面的链接方式: TabBarController -> NavigationController -> TopPlacesTableViewController -> RecentPhotosTableViewController -> PhotoViewController

当我单击最后一个视图(即 PhotoViewController 的那个)中的“后退”按钮时发生错误。此操作应该显示以前的 RecentPhotosTableViewController,但访问了一个未知的已释放对象,有时在 viewWillAppear 和 ViewDidAppear 事件之间。

此外,我有一个 GenericTableViewController,它是 TopPlacesTableViewController 和 RecentPhotosTableViewController 的父级。子级在父级中设置一个 NSMutableArray 属性,该属性是加载到子级视图中的数据。

我目前使用的是 iOS6 和 XCode4.5。

[更新:在控制台中,显示了这一行 - “[UIView _forgetDependentConstraint:]: message sent to deallocated instance xxx”]。

【问题讨论】:

  • 你是用ARC编译还是不用?
  • 是的,我是。我刚刚回复了 Anoop Vaidya 我如何确认 ARC 已打开。

标签: objective-c ios xcode dealloc nszombie


【解决方案1】:

我觉得你没有使用 ARC,并且你没有保留传递你以前的对象。同时前一个对象被释放,然后你访问它。

您可以重构代码以使用 ARC 或保留或自动释放。

【讨论】:

  • 感谢您的及时答复!我刚刚检查了“您的目标 -> 构建设置 -> Apple LLVM 编译器 - 语言 -> Objective-C 自动引用计数”的设置,并确认 ARC 已打开。有没有我可以准确指出释放后释放和访问的对象?
  • 这很难找到,你必须做断点并遍历每一行......这是一项艰巨的任务。或者你可以做的一件事是,因为你确定你正在使用 ARC,所以你自己不能做 [... release]。所以你能做的就是把每一个对象都做强,然后检查。
  • 发生了最奇怪的事情。删除 PhotoViewController 并在 storyboard 上拖一个新的之后,错误没有再次发生。
  • 我猜这个错误是由于新功能 Autolayout 中的错误而发生的(即编译器创建了一些 NSLayoutConstraint 对象,但由于某些未知原因,这些对象被释放的次数超过了应有的次数)。通过删除和重新创建,这迫使 Xcode 重建约束。我假设这是因为我从控制台收到的错误消息(即 UIView _forgetDependentConstraint),但我不能绝对确定。无论如何感谢大家的建议!
【解决方案2】:

转到产品>编辑方案>诊断点击然后检查启用僵尸对象

创建一个断点并逐步了解哪个对象被释放,它可能指向您的对象的指针已被删除,然后操作系统已释放您的对象。

【讨论】:

  • 我启用了 Zombie 对象,但调用堆栈没有用。 Objective C 代码中唯一可以理解的代码行是由 AppDelegate 的 main 方法触发的(即 @autoreleasepool {return UIApplicationMain(argc, argv, nil, NSStringFromClass([PhotosAppDelegate class]));})。
猜你喜欢
  • 2012-02-05
  • 2013-12-02
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多