【问题标题】:iOS: Memory warning makes buttons disappeariOS:内存警告使按钮消失
【发布时间】:2012-08-09 06:50:10
【问题描述】:

我在 iPod touch 上运行我的 iOS 应用程序,我似乎收到了很多内存警告。不知道为什么会这样,我使用了 Instruments 并且我没有使用那么多内存。无论如何,有时在收到内存警告后,工具栏上的某些 UIBarButtonItems 会消失(例如,导航控制器中的后退按钮)。

这是一个真正的问题,唯一的解决方法是终止应用并重新启动。我该如何处理这种情况?也许有办法重新加载栏按钮项目?有没有人遇到过类似的情况,你会怎么做?

感谢您的帮助。

编辑:我应该补充一点,我的 UIBarButtonItems 有自定义图像。我在 viewDidLoad 中设置了这些图像。也许内存不足警告会释放这些图像,然后它们就不会再次加载。我想可能是这样,但是我如何确保如果视图再次出现,图像会再次加载?

EDIT2:问题似乎是在 viewDidUnload 我将 BarButtonItems 之一设置为 nil。我认为这实际上是在我设置 IBOutlet 时由 XCode 自动插入的。这是正确的做法,还是我不应该将其设置为零。如果是这样,我以后如何正确重新分配它?

【问题讨论】:

    标签: objective-c ios memory warnings memory-leaks


    【解决方案1】:

    不要治疗症状(UIBarButtons 消失),而是尝试找出您的程序在哪里泄漏内存。以下是查找内存泄漏的一些提示:

    1. 检查您的代码并找到您 malloc 的所有实例,并确保您正在解除分配
    2. 使用分析器查找内存泄漏,大多数情况下它会命名未正确释放的对象。
    3. 查看此presentation 以查找泄漏。

    最后,在您确定没有出现内存泄漏和那些警告,但您的按钮仍然消失后,请在新问题中发布一些代码。

    【讨论】:

    • 他可能没有泄漏内存; iPod touch 的内存容量通常较低。如果应用程序是为更高容量的设备编写的,它可以轻松触发内存警告而不会出现任何泄漏。
    • 我的 iPhone 没有任何问题。 iPod touch 的内存容量似乎确实要低得多。另外,我正在使用 ARC。
    • 另外,这些内存警告经常出现在我通过 Facebook 登录时,即调用 Facebook 应用程序进行身份验证。不确定我是否可以更改与此相关的任何内容。
    • @user1013725 除了 Michael 的好建议之外,请确保您通过静态分析器 (shift+command+B) 运行代码并解决它报告的任何问题。这对于快速识别非 ARC 代码中简单泄漏的来源特别有用。您应该绝对不会收到来自分析器的警告。
    【解决方案2】:

    如果您在本地设置图像并且没有对它们的强引用,那么一旦超出范围,它们就会被操作系统视为“一次性”。当收到内存警告时,它们被释放。尝试保持对图像的更大范围的参考。

    【讨论】:

    • 好的,所以我做了更多测试,似乎当我收到内存警告(或者如果我在模拟器中模拟它)时,我的 BarButtonItems 设置为 nil。我如何重新分配它们?我在 Storyboard 中创建了它们,所以它们是 IBOUtlet(强大且非原子)。
    • 补充一点,我认为不仅仅是图像被释放,整个 UIBarButtonItem 都被释放了。
    • 你应该实现 didreceivememorywarning 并释放一些你不需要的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多