如何在没有Objective-C的情况下创建NSAutoreleasePool?

fba*_*ipe 7 c c++ macos objective-c

我有用C++编写的多平台游戏.在mac版本中,即使我没有任何obj-c代码,我使用的其中一个库似乎是自动释放的东西,我得到内存泄漏,因为我没有创建NSAutoreleasePool.

我想要的是能够在不使用obj-c代码的情况下创建(并销毁)NSAutoreleasePool,因此我不需要创建.m文件,只需更改我的构建脚本.那可能吗?怎么办?

OBS:Tagged C和C++,因为任何一种语言的解决方案都可以.

aba*_*ert 2

您无法避免实例化 Objective-C 运行时\xe2\x80\x94,但显然您已经拥有其中之一。

\n\n

如果您想与 C 运行时交互,可以使用 Objective-C 运行时 API,如Objective-C 运行时编程指南Objective-C 运行时参考中所述。

\n\n

这个想法是这样的(未经测试):

\n\n
#include <objc/runtime.h>\n#include <objc/objc-runtime.h>\nid allocAndInitAutoreleasePool() {\n  Class NSAutoreleasePoolClass = objc_getClass("NSAutoreleasePool");\n  id pool = class_createInstance(NSAutoreleasePoolClass, 0);\n  return objc_msgSend(pool, "init");\n}\nvoid drainAutoreleasePool(id pool) {\n  (void)objc_msgSend(pool, "drain");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想从另一个文件调用这些函数,当然您还必须在其中包含 objc/runtime.h。或者,您可以在 allocAndInit 函数的返回中将 id 强制转换为 void*,并在排出函数中采用 void* 并强制转换回 id。(您也可以前向声明 struct objc_object 和 typedef struct objc_object *id,但我相信实际上并不能保证是正确的定义。)

\n\n

您不必在链接命令中传递 -lobjc 。

\n\n

不用说,仅仅让构建脚本处理 .m 文件可能会减少工作量。

\n

  • 您应该能够使用纯 C 代码加载运行时文件(不需要“-lobjc”)。您可以在这里看到一个示例:https://github.com/rnapier/ios5ptl/blob/master/ch20/Runtime/MyMsgSend.c(我不建议您使用`myMsgSend()`,这是一个演示其他的东西。我只是展示了一个可编译的 C 文件,它表明了这种方法的工作原理。) (2认同)