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

标签 c++ objective-c c macos

我有一个用 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/

相关文章:

c++ - C/C++ 中的 CGI/FastCGI 应用程序(套接字编程问题)

objective-c - 如何在Objective-C中执行类常量?

c - 链表中的所有节点都指向同一个对象

c - 不使用指针的堆栈实现

c - 双自由或腐败(出)fclose

java - Android C++ 上的 Qt 与 Java 的互操作性因 SIGSEGV 无效或原始返回类型而失败

c++ - 如何正确创建oauth签名基字符串?

c++ - 从二阶导数计算的曲线的 SIMD 优化

ios - 如何解决 NSPredicate error 'Can' t use in/contains operator with collection 8 (not a collection)

objective-c - 是否在没有 Cocoa 的情况下使用 Objective-C?