我总是对内存泄漏非常挑剔,我不明白为什么我的垃圾收集应用程序会泄漏。我的代码完全是内存托管的,它运行得很好,没有垃圾回收,没有一个漏洞。然而,一旦我打开垃圾收集,它就会泄漏!
为了证明这一点,为什么垃圾收集应用程序中会出现这种泄漏?(将此虚拟代码放在applicationDidFinishLaunching:)
NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) {NSBeep();}];另外,有没有一种方法可以防止使用脚本桥的应用程序(垃圾收集或其他)中的泄漏?它们似乎都泄漏了,甚至xcode中的示例也是如此。
谢谢大家!
发布于 2010-04-26 11:08:23
以下是部分答案。
在大多数托管语言中,每个能够保存对另一个对象的引用的结构都嵌入了有关哪个偏移量可以保存内存地址的信息。例如,在每个堆栈帧中,都有一个位置告诉垃圾收集器在哪里查找地址。
像Objective-C这样的基于C的语言就没有这个功能。
为了保证程序的正确性,对象越多越好,不要过早地释放对象。因此,Objective-C中的垃圾收集器查找看起来像地址的模式,但无法确定它们是否是真正的地址。这可能(并且几乎肯定会)导致引用的误报(并且与您可以在C中使用的某些内存管理技术不兼容)。因此,某些对象可能会过期,直到某个随机整数不复存在。
另外,你如何辨别什么是泄漏?您只是比较了内存占用,还是通过“泄漏”工具检查了它们?你试过“GC Monitor”仪器了吗?
发布于 2010-04-26 11:34:56
对不起,我忘了提了,我用的是Instruments中的"Leaks“工具。这就是我看到的漏洞所在。我还没有试过"GC Monitor“仪器。漏洞很小,我无法使用扩展的详细信息将它们追溯到我的代码。
我总是以老式的方式进行内存管理,所以从本质上讲,我是一个GC新手。
所以这种GC模式是正常的吗?我应该忽略它吗?
https://stackoverflow.com/questions/2710877
复制相似问题