【发布时间】:2012-06-29 13:21:01
【问题描述】:
我有用 C++ 编写的多平台游戏。在 mac 版本中,即使我没有任何 obj-c 代码,但我使用的库之一似乎是自动释放的东西,并且我因此而出现内存泄漏,因为我没有创建 NSAutoreleasePool。
我想要的是能够在不使用 obj-c 代码的情况下创建(和销毁)一个 NSAutoreleasePool,因此我不需要创建一个 .m 文件,并为此更改我的构建脚本。那可能吗?怎么可能?
OBS:标记为 C 和 C++,因为任何这些语言的解决方案都可以。
【问题讨论】:
-
您的问题是编写任何objective-c 代码吗?或者当您只需要 .c/.cpp 时,您的项目中有 .m 文件?
-
请注意,虽然@abarnert 的代码是一个可行的解决方案,但这表明库中存在错误。在不生成自动释放池的情况下,任何 C 或 C++ 函数都不应调用 ObjC 代码。如果这是 Apple 代码,您应该在 bugreport.apple.com 上打开雷达。
-
@RobNapier:+1。如果它是第三方库,您应该向库供应商提交错误。许多第三方库(尤其是跨平台库)假设任何 Mac 应用程序都有一个 Cocoa 运行循环和一个活动的 NSAutoreleasePool,即使您只调用 C/C++ 接口,这显然是错误的。他们可能无法或不愿意修复它,但您应该让他们知道。
-
当然。不过,
objc_autoreleaseNoPool上的断点应该很快就会显示出罪魁祸首。 -
就个人而言,我发现 CMake 比 objc-runtime 更容易理解。我做过的大多数 CMake 项目都有一个针对每个平台的平台特定目录,以及 CMake 中的几行代码来选择要放入的正确目录(您可以从示例或现有开源项目中复制该目录)。但另一方面,有时在背后玩 ObjC 也很有趣,所以如果你想那样做,那就去做吧。
标签: c++ objective-c c macos