我总是非常挑剔内存泄漏,我无法理解为什么我的垃圾收集应用程序泄漏。我的代码完全由内存管理,它运行良好,没有垃圾收集,没有一个泄漏。但是,一旦我打开垃圾收集它就会泄漏!
为了证明一点,为什么垃圾收集应用程序会泄漏? (将此虚拟代码放在applicationDidFinishLaunching:)
NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) {NSBeep();}];
此外,有没有办法防止使用Scripting Bridge的应用程序(垃圾收集或其他)泄漏?似乎它们都泄漏了,甚至是xcode中的样本。
谢谢大家!
答案 0 :(得分:2)
这是部分答案。
在大多数托管语言中,每个能够保存对另一个对象的引用的结构都会嵌入有关哪个偏移量可以容纳内存地址的信息。例如,在每个堆栈框架中,有一个地方告诉垃圾收集器在哪里查找地址。
像Objective-C这样的基于C的语言没有。
对于程序的正确性,最好有太多的对象,而不是过早地释放对象。因此,Objective-C中的垃圾收集器会查找看起来像地址的模式,但无法确定它们是否确实是地址。这可能(并且几乎必然会)导致引用的误报(并且与您可以与C一起使用的某些内存管理技术不兼容)。因此,在某些随机整数不再存在之前,某些对象可以比它们的实用性更长。
另外,你怎么知道什么是漏洞?你刚刚比较了内存占用,还是通过'Leaks'仪器检查了它们?你试过'GC Monitor'仪器吗?
答案 1 :(得分:0)
抱歉,我忘了提及它,我使用仪器中的“Leaks”仪器。在那里,我看到了泄漏。我还没有尝试过“GC Monitor”仪器。泄漏很小,我无法使用扩展细节将它们追溯到我的代码。
我总是以旧式方式完成我的记忆管理,所以本质上我是GC的新手。
那么GC模式是否正常?我应该忽略它吗?