OSX上的SDL + OpenGL:NSAutoreleaseNoPool()

时间:2011-02-17 16:51:33

标签: macos opengl sdl nsautoreleasepool

我正在使用OpenGL和SDL处理一些跨平台代码,但在Mac OSX上立即遇到问题。

供参考,这里是GitHub上的代码库:https://github.com/GrooveStomp/platformer

我也推动了我在同一个回购中看到的错误:https://github.com/GrooveStomp/platformer/blob/master/errors.txt

现在,从读取I'已经做了,它好像SDL只是周围的Mac OSX&#39包; S Objective-C的可可层,我需要声明我自己的NSAutoreleasePool来包装我的整个程序。这是对的吗?

我刚刚看到这个链接:http://sourceforge.net/apps/wordpress/paintown/2010/12/26/sdl-and-osx/,其中作者从源代码安装并且没有任何问题。我使用Homebrew安装,我认为这相当于作者的第3步,因为我必须指定" -framework OpenGL"在建设时。

[编辑]

因此,事实证明应该通过以下三个步骤来处理NSAutoreleaseNoPool()问题:

  1. main()应该有这个签名:int main(int argc,char * argv [])
  2. #include< SDL.h>在源文件中main()是。
  3. 与-lSDLmain链接
  4. 结果是SDL将使用NSAutoreleasePool包装它自己的main()以及我的主要部分。但是,当我这样做时,我得到了这里显示的错误:

    https://github.com/GrooveStomp/platformer/blob/master/make_errors.txt

1 个答案:

答案 0 :(得分:1)

当您在没有安装NSAutoreleasePool的线程上发送Objective-C消息时,您会收到有关内存“Just Leaking”的消息。将整个程序包装在自动释放池中的问题是它永远不会耗尽,并且存在内存不足的风险。而是在事件循环开始时创建池,并在每次迭代结束时排空。这样做是正确的,应该修复所有“正在泄漏”错误。

由于NSAutorelasePool对象不是普通对象,因此它们的正确使用与几乎所有其他Cocoa对象略有不同。这是一个示例:


while(1)
{
    NSAutoreleasePool* pool = [NSAutoreleasePool new];

    // Do your event processing

    [pool drain];
}