我总是对内存泄漏非常挑剔,我不明白为什么我的垃圾收集应用程序会泄漏。我的代码完全由内存管理,并且在没有垃圾收集的情况下运行良好,没有一次泄漏。但是,一旦我打开垃圾收集,它就会泄漏!
只是为了证明一点,为什么垃圾收集应用程序会泄漏? (将此虚拟代码放在 applicationDidFinishLaunching:)
NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) {NSBeep();}];
另外,有没有办法防止使用 Scripting Bridge 的应用程序泄漏(垃圾收集或其他)?似乎它们都泄漏了,甚至是 xcode 中的示例。
谢谢大家!
最佳答案
这是部分答案。
在大多数托管语言中,每个能够保存对另一个对象的引用的结构都嵌入了关于哪个偏移量可以保存内存地址的信息。例如,在每个堆栈帧中,都有一个地方告诉垃圾收集器到哪里寻找地址。
基于 C 的语言(如 Objective-C)没有这一点。
为了程序的正确性,拥有过多的对象总比过早释放对象要好。因此,Objective-C 中的垃圾收集器会寻找那些看起来像 地址的模式,但无法确定它们是否确实是地址。这可能(并且几乎必然会)导致引用的误报(并且与您可以在 C 中使用的某些内存管理技术不兼容)。因此,某些对象可能会失去其用途,直到某个随机整数不复存在。
此外,您如何判断什么是泄漏?您只是比较了内存占用量,还是通过“泄漏”工具检查了它们?您尝试过“GC Monitor”仪器吗?
关于objective-c - 垃圾收集泄漏?脚本桥泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2710877/