我有用 C++ 编写的多平台游戏。在 mac 版本中,即使我没有任何 obj-c 代码,我使用的库之一似乎是自动释放的东西,并且我因此而出现内存泄漏,因为我没有创建 NSAutoreleasePool。
我想要的是能够在不使用 obj-c 代码的情况下创建(和销毁)一个 NSAutoreleasePool,所以我不需要创建一个 .m 文件,并为此更改我的构建脚本。那可能吗?怎么可能呢?
OBS:标记为 C 和 C++,因为任何这些语言的解决方案都可以。
我有用 C++ 编写的多平台游戏。在 mac 版本中,即使我没有任何 obj-c 代码,我使用的库之一似乎是自动释放的东西,并且我因此而出现内存泄漏,因为我没有创建 NSAutoreleasePool。
我想要的是能够在不使用 obj-c 代码的情况下创建(和销毁)一个 NSAutoreleasePool,所以我不需要创建一个 .m 文件,并为此更改我的构建脚本。那可能吗?怎么可能呢?
OBS:标记为 C 和 C++,因为任何这些语言的解决方案都可以。
你无法避免实例化 Objective-C 运行时——但显然你已经拥有了其中之一。
如果您想从 C 与运行时交互,您可以使用 Objective-C 运行时 API,如Objective-C 运行时编程指南和Objective-C 运行时参考中所述。
这个想法是这样的(未经测试):
#include <objc/runtime.h>
#include <objc/objc-runtime.h>
id allocAndInitAutoreleasePool() {
Class NSAutoreleasePoolClass = objc_getClass("NSAutoreleasePool");
id pool = class_createInstance(NSAutoreleasePoolClass, 0);
return objc_msgSend(pool, "init");
}
void drainAutoreleasePool(id pool) {
(void)objc_msgSend(pool, "drain");
}
如果你想从另一个文件调用这些函数,当然你也必须在其中包含 objc/runtime.h。或者,或者,您可以在 allocAndInit 函数的返回中将 id 强制转换为 void*,然后在 drain 函数中获取 void* 并强制转换回 id。(您也可以前向声明 struct objc_object 和 typedef struct objc_object *id,但我相信这实际上并不能保证是正确的定义。)
您不必在链接命令中传递 -lobjc 。
不用说,仅仅让构建脚本处理 .m 文件可能会减少工作量。