垃圾回收泄漏?脚本桥泄漏?

3

我总是对内存泄漏非常挑剔,但我无法理解为什么我的垃圾回收应用程序会泄漏。我的代码完全是内存管理的,如果没有垃圾回收,它可以很好地运行,没有任何泄漏。但是,一旦我打开垃圾回收,它就会泄漏!

只是为了证明一点,在applicationDidFinishLaunching中放置这个虚拟代码,为什么它会在垃圾回收的应用程序中泄漏?

NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) {NSBeep();}];

此外,有没有办法防止使用Scripting Bridge的应用程序(包括垃圾回收或其他方式)泄漏?似乎它们都会泄漏,即使是Xcode中的示例应用程序也是如此。

谢谢大家!


2
你使用什么来测量泄漏?哪里在泄漏? - Nicholas Riley
2个回答

2
这是部分答案。
在大多数托管语言中,每个能够持有对另一个对象引用的结构都嵌入了关于哪个偏移量可以持有内存地址的信息。例如,在每个堆栈帧中,都有一个位置告诉垃圾收集器在哪里查找地址。
像Objective-C这样的基于C的语言没有这个功能。
为了程序正确性,最好拥有一些过多的对象而不是过早释放对象。因此,Objective-C中的垃圾收集器会寻找看起来像地址的模式,但无法确定它们是否确实是地址。这可能会导致引用的误判(并且与您可以使用C的某些内存管理技术不兼容)。因此,某些对象可能会一直存在,直到某个随机整数不存在为止。
另外,如何确定哪些是泄漏?您只是比较了内存占用量,还是通过“泄漏”工具进行了检查?您尝试过“GC监视器”工具吗?

0

抱歉,我忘了提到,我在Instruments中使用“Leaks”工具。那里是我看到泄漏的地方。我还没有尝试过“GC Monitor”工具。泄漏很小,我无法使用扩展细节将其追溯到我的代码。

我一直以来都是用老式方法进行内存管理,因此本质上我是一个GC新手。

所以这种GC模式是正常的吗?我应该忽略它吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接