2012-11-23 52 views
0

我有一个用ARC编写的Cocoa应用程序,允许用户创建和打开新窗口。 (这就像一个文档模型,但我没有使用nsdocumentMac可可:无法释放窗口来获取其内存

每个新窗口都需要大量的内存,如果用户关闭窗口,我想返回。

据我所知,[window close]只是隐藏窗口,但我也使用,但NSwindowcontroller及其窗口在结束后仍然存在。

在我窗口的XIB文件中的对象包含了一些使用malloc分配的大C数组的,所以我也试着通过发送调用windowcontroller的windowWillClose:方法中的通知中心,该通知调用的方法中解放出来在窗口关闭之前在相关对象内部释放C数组。同样,这是没有任何效果的,即使试图释放数组的方法被调用并且数组显然已被释放,但根据Activity Monitor的说法,并没有释放内存。我也尝试释放-(void) dealloc中的数组,但这似乎不会被要求关闭。

那么,当一个窗口关闭时,怎样才能最好地获取内存?

编辑:据对this stackoverflow page由伯努瓦评论,

“发布关闭时,然而,由窗口控制器所有的窗户被忽略。”

这是真的吗?如果是这样,我怎么能在ARC中解决这个问题?

回答

3

释放内存不能总是返回到操作系统。这只是一个事实,至少在没有压缩垃圾收集器的系统上。

不要注重在活动监视器中的统计数据,除非你知道确切你在看什么。除非您对系统有相当全面的了解 - 包括虚拟内存,共享库占用内存的哪部分内容以及您正在使用的分配器的行为,否则这些信息通常不会有用。 NSArrayNSMutableArray类在分配时有一些相当不透明的行为,顾名思义,它们通常是而不是线性数组。

建议:只要你的窗口被释放,忽略活动监视器中的统计信息。您可以使用仪器检查泄漏。

作为活动监视器应该被忽略的一个例子:如果你在1个KiB块中进行500 MiB分配,然后释放奇数块,显然它们不能返回到操作系统,因为大多数现代系统的页面粒度至少为4 KiB。如果您在1 MiB块中分配相同的500 MiB并释放奇数块,它们将返回到操作系统,并且活动监视器报告的内存使用量将减少250 MiB。 (请注意,4 KiB阈值不是发生此行为的阈值,它取决于malloc()的确切分配行为,以及一些在OS X上取决于CPU和RAM数量的参数。)

但是,这可能是不相关的。在每种情况下,如果您再次分配250 MiB,您将回到您开始的位置。使用较少的私有内存很好,但这只影响你的应用程序与其他应用程序的搭配。

+0

谢谢,但我不确定我的2009年macbook足够强大,足以运行仪器。我有它的口吃,并发送笔记本电脑风扇进入超速大约10分钟监测一个窗口,这通常需要约5秒仪器不运行的开放。 –

+0

@ ChristianJ.B .:恩,这很有趣。从2005年我的Mac可以运行得很好...... –

+0

如果有任何帮助,我正在运行Instruments-> leaks。 –