2011-02-17 42 views
0

我正在研究一些使用OpenGL和SDL的跨平台代码,但立即遇到了Mac OSX上的问题。OSX上的SDL + OpenGL:NSAutoreleaseNoPool()

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

我还推我看到到同一回购错误:现在https://github.com/GrooveStomp/platformer/blob/master/errors.txt

,从阅读中,我已经做了,它好像SDL只是简单地包装Mac OSX的Objective-C Cocoa图层,我需要声明自己的NSAutoreleasePool来包装我的整个程序。那是对的吗?

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

[编辑]

所以,事实证明,在NSAutoreleaseNoPool()问题应该通过以下三个步骤来照顾:

  1. 的main()应该有这样的签名:INT主( int argc,char * argv [])
  2. #include <SDL.h>在main()所在的源文件中。
  3. 与-lSDLmain

结果链接是SDL将包裹它自己的main()与NSAutoreleasePool和周围的所有我的主。然而,当我这样做,我得到如下所示的错误:

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

+0

哪个SDL和OSX版本? – genpfault 2011-02-17 17:18:46

+0

OSX达尔文10.6.0,SDL 1.2.14 – GrooveStomp 2011-02-18 17:38:39

回答

1

,当你在地方上发送线程Objective-C的消息,而无需一个NSAutoreleasePool您获取有关内存“只是泄漏”的消息。将整个程序封装在自动释放池中的问题永远不会消耗殆尽,并且可能会导致内存不足。相反,在事件循环开始时创建池,并在每次迭代结束时耗尽。这样做是正确的地方应该解决所有的“泄漏”错误。

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


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

    // Do your event processing 

    [pool drain]; 
}