处理关键事件时NSTextField泄漏

时间:2011-08-18 22:40:43

标签: objective-c cocoa macos memory-leaks xcode4

我是这个论坛的新手,我已经搜索过,但没有找到任何问题的答案,这一直困扰着我本周最好的部分。

每次按下某个键时,NSTextField都会导致内存泄漏。

我已从我的代码中隔离了这个问题,可以按如下方式重现:

  • 创建一个新的“Cocoa Application”项目。
  • 在主菜单xib窗口中放置NSTextfield。 (没有约束力,出口或行动)
  • 产品 - >配置文件,选择“内存泄漏”仪器(在XCode 4中)

在用户在文本字段中输入字符之前不会泄漏。 我得到8个泄漏的NSCFString对象,其中包含以下类型的32字节:

Library     Responsible Caller
0     CFString     Malloc     00:11.524.538     1     0x100130bb0     32     AppKit     -[NSEvent charactersIgnoringModifiers]
1     CFString     Malloc     00:11.622.145     1     0x100136950     32     AppKit     -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]

请注意,此项目除自动生成的内容外没有其他代码。

如果有其他人可以重现这个问题,我甚至会提出一个如何防止它出现的建议。

使用XCode 4.0.2的OS X 10.6.8(与3.2.6相同的问题)

任何建议都会受到高度赞赏,并会降低我目前的挫折感。

更新

尝试在不同的mac上创建上述项目。 发现其中一个没有泄漏(使用与上面相同的程序来创建项目) 在从未安装过XCode的mac上安装了XCode 4 - 没有泄漏!

仍然会泄漏记忆。

  • 在同一个MPro上擦除硬盘,安装OS X 10.6,软件更新到10.6.8
  • 已安装XCode4
  • 创建了与上面相同的测试项目

没有内存泄漏!!!!!

现在很明显,这个问题的根源在于安装中的某个地方,而不仅仅是仪器的“假阳性”。我的个人资料运行被执行了多次,因此有一次性,并且我的Mac上的行为是100%可重新生成的。

现在出现问题:我还有27英寸的iMac硬盘擦除不是一个选项。 我猜测在安装或重新安装XCode时,安装了一些东西(Framework?)没有得到更新/删除。

非常感谢您对此问题的原因的看法。

2 个答案:

答案 0 :(得分:1)

这几乎肯定是误报。 Leaks仪器不是绝对可靠的,并且当它们不是时,它可能将某些东西标记为泄漏(单例是常见的例子),请参阅my answer to this question

我怀疑这里看到的是字段编辑器的创建,它为每个包含至少一个文本字段单元格的窗口创建一次。它是懒惰创建的,因此只在需要时才会被实例化,即文本编辑开始时。然后将其重新用于该窗口中的所有文本字段编辑,并且在窗口消失之前不会取消分配。这正是可以在泄漏工具中触发误报的行为。

NSTextField等常见对象不太可能发生重大内存泄漏。它们经过了彻底的测试,并且在操作系统版本之间没有太大变化。

答案 1 :(得分:0)

尝试关闭XCode,再次打开它,然后在项目上运行“清理”。有时古代死去的水手的鬼魂住在IDE中,对不知情的旅行者造成严重破坏。但严重的是......这似乎不应该发生。尝试清理并重新启动。