【问题标题】:Memory leak on keyboard dismiss键盘关闭时的内存泄漏
【发布时间】:2011-03-21 09:36:48
【问题描述】:

我有一个显示 UITextField 的视图控制器。我带键盘来了

- (void)viewDidAppear:(BOOL)animated
{
    [wordTextField becomeFirstResponder];
}

然后我有一个按钮,它在不关闭控制器本身的情况下关闭键盘:

- (void)cancel:(id)sender
{
    if([wordTextField isFirstResponder])
    {
        [wordTextField resignFirstResponder];
    }

}

这个 Instruments 会在

上显示泄漏
#   Category    Event Type  Timestamp   RefCt   Address Size    Responsible Library Responsible Caller
0   Malloc 128 Bytes    Malloc  00:11.239   1   0x3b82550   128 UIKit   UIKeyboardInputManagerClassForInputMode

提到的堆栈中的某处[wordTextField resignFirstResponder]

即使我自己不带键盘让用户触发它,我仍然有泄漏。在这种情况下,堆栈中没有提到我的代码。

【问题讨论】:

  • 只是为了测试,我用单个UITextField 创建了新的基于视图的项目,仅此而已。点击文本字段会弹出 kbd 并导致上面提到的内存泄漏。我正在使用 Instruments 2.1 和 Xcode 3.2.2。我应该忽略这个泄漏吗?
  • 模拟器还是设备?如果是设备,请发布示例项目,很好奇。
  • 它是模拟器,但仍有兴趣确定。今天晚些时候将在设备上检查。除了我原始项目中的这个,我还有 2 个open_handle_to_dylib_path,据我从谷歌搜索了解,这可能是模拟器的误报。但找不到任何关于 UIKeyboardInputManagerClassForInputMode 的信息,所以可能是严重问题。

标签: iphone memory-leaks


【解决方案1】:

Leaks Instrument 向您显示在应用程序的正常过程中不会被释放的内存(因为没有任何对它的引用)。这本身没什么大不了的,当应用程序退出时它将被释放。许多框架代码将分配并保留这些非常小的内存块。我不知道它们是错误还是对应用程序的运行方式至关重要。不管怎样,我们必须接受它们是完全正常的。

Leaks 会将这些内存块识别为“Leaks”,这听起来很糟糕,但这并不是仪器可以帮助您识别的“Leaks”。

“真正的”泄漏发生在可以多次运行的代码中,它分配了一些永远不会释放的内存,因此随着时间的推移会消耗越来越多的内存,直到所有内存都用完,你的应用就会崩溃。

因此,如果您有一个应用程序,无论您使用多久或如何使用它,它都会在苹果框架中“泄漏”128 个字节,您通常不必担心。

但是,如果您的应用程序说,每次单击按钮时,它都会分配一个永远不会释放的新字符串 - 无论字符串有多少字节 - 如果用户按下按钮的次数足够多,这将消耗所有应用程序可用的内存并最终使其崩溃。这是您需要注意的泄漏类型。

泄漏仪器实际上无法区分这两种,但您需要能够。例如,您可能需要一种单例对象,它只有一个实例,并且需要在应用程序的整个生命周期中都存在。您在应用程序启动时创建对象,实际上您永远不需要释放该对象,它可以在应用程序退出时被杀死。泄漏会将其标记为泄漏,并且与您合作的其他一些开发人员认为这意味着您不知道自己在做什么,他们会像小孩子一样跑到您的老板面前说“他正在编写真正泄漏的代码,那就是真的很糟糕”。而你的老板,不是程序员,会认真对待他,因为这听起来确实很糟糕,而且他从一所著名的大学获得了 2.2 的 CS,所以他必须知道他在说什么。当它真的是完全合理的并且正是你想要做的事情时。

因此,请使用 Leaks 工具来查找代码中可能会破坏您的应用的错误。不必担心在 Apple 框架中发现“泄漏”的每个字节。

【讨论】:

  • @iPhoneDev:谢谢。顺便说一句,在设备上,仪器中没有产生这样的泄漏。
猜你喜欢
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2013-03-29
  • 2010-11-28
  • 2018-08-26
  • 2013-07-12
  • 2012-09-10
相关资源
最近更新 更多