【问题标题】:ARC not seems to be working when upgraded to Xcode 5 from Xcode 4.2从 Xcode 4.2 升级到 Xcode 5 时,ARC 似乎无法正常工作
【发布时间】:2014-05-30 12:30:29
【问题描述】:

我在 Xcode 4.2 中处理一个项目,该项目不使用任何故事板,而是普通的 xib。 ARC 工作得非常好,对此很满意,没问题。

现在,当我从 Xcode 4.2 升级到 Xcode 5 时出现了奇怪的问题(仍然没有使用故事板)。 我使用 'popViewControllerAnimated' 函数弹出一个屏幕,显然,屏幕被弹出。

但是当我分析内存分配时,我发现即使在屏幕弹出后,屏幕内存也没有释放

此外,当我再次打开该屏幕时,即使关闭它,也会分配内存并且不会释放它。 看起来更像是一个保留循环,但我很确定我从未使用过 'retain'

现在我已经升级到 Xcode 5.1.1,这个奇怪的问题仍然存在。

将我的项目转换为 'Storyboard' 设计对我来说是一个完全的负担,这就是我保留普通 xib 的原因。

我现在已经厌倦了 Google 和搜索包括 Stackoverflow.com 在内的所有论坛。

各位,请帮我解决问题。

它对我来说是一个救生员

【问题讨论】:

  • 使用 Instruments 中的 Leaks 工具查看内存分配(以及可能的泄漏)。如果对象在你认为应该被释放后仍然存活,它会让你看到保留计数根据所涉及的代码而发生的详细变化。

标签: ios objective-c xcode automatic-ref-counting


【解决方案1】:

ARC 不是魔法。 ARC 跟踪对对象的强引用。当对某个对象的强(拥有)引用数量降至零时,该对象将被释放。

如果你的一个视图控制器没有被释放,这意味着在某处有一个对它的强引用。一种可能性是“保留循环”,其中 2 个对象每个都具有彼此的强引用。当您执行诸如拥有另一个辅助对象的对象并且辅助对象具有返回拥有对象的(强)指针之类的事情时,就会发生这种情况。通常的解决方案是让所有者保持对其对象的强引用,并让拥有到拥有的指针保持弱(如委托)。

SO 读者无法为您找到问题。

您是否尝试过在您的代码上运行分析工具?它可能会为您指出问题所在。您还应该按照 Phillip 的建议通过 Leaks 仪器运行程序。这两种工具都非常有用,尽管都不是 100% 万无一失的。

如果做不到这一点,您可能需要找一位高级 iOS 开发人员坐下来进行代码审查。通常,在向其他人解释程序的逻辑和实现的过程中,您自己会发现问题。

【讨论】:

  • 感谢您的回复 :) 即使问题仍然存在。我想我应该将我的应用程序转换为故事板样式
【解决方案2】:

检查您是否在一个视图控制器中设置为弹出视图控制器的委托。因为当弹出的视图控制器被解除时,您必须将委托设置为 nil。忘记这一点很常见。

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多