我有一个用 C++ 编写的多平台游戏。在 mac 版本中,即使我没有任何 obj-c 代码,我使用的库之一似乎是自动释放的东西,而且我会因此发生内存泄漏,因为我没有创建 NSAutoreleasePool。
我想要的是能够在不使用 obj-c 代码的情况下创建(和销毁)NSAutoreleasePool,因此我不需要创建 .m 文件,也不需要为此更改我的构建脚本。那可能吗?怎么办?
OBS:标记为 C 和 C++,因为任何这些语言的解决方案都可以。
最佳答案
您无法避免实例化 Objective-C 运行时 — 但显然您已经拥有了其中之一。
如果您想与 C 的运行时交互,您可以使用 Objective-C 运行时 API,如 Objective-C Runtime Programming Guide 中所述和 Objective-C Runtime Reference .
这个想法是这样的(未经测试):
#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 文件可能工作量较小。
关于c++ - 如何在没有 Objective-C 的情况下创建 NSAutoreleasePool?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11237579/