Macos SDL&x2B;OSX上的OpenGL:NSAutoreleaseNoPool()

Macos SDL&x2B;OSX上的OpenGL:NSAutoreleaseNoPool(),macos,opengl,sdl,nsautoreleasepool,Macos,Opengl,Sdl,Nsautoreleasepool,我正在使用OpenGL和SDL编写一些跨平台代码,但在MacOSX上立即遇到了问题 以下是GitHub上的代码库供参考: 我还将我看到的错误推到了同一回购协议上: 现在,从我所做的阅读来看,似乎SDL只是简单地围绕MacOSX的Objective-C Cocoa层,我需要声明我自己的NSAutoreleasePool来包装我的整个程序。对吗 我刚刚看到了这个链接:作者从源代码安装,没有任何问题。我使用自制软件进行安装,我认为这相当于作者的第3步,因为我在构建时必须指定“-framework Op

我正在使用OpenGL和SDL编写一些跨平台代码,但在MacOSX上立即遇到了问题

以下是GitHub上的代码库供参考:

我还将我看到的错误推到了同一回购协议上:

现在,从我所做的阅读来看,似乎SDL只是简单地围绕MacOSX的Objective-C Cocoa层,我需要声明我自己的NSAutoreleasePool来包装我的整个程序。对吗

我刚刚看到了这个链接:作者从源代码安装,没有任何问题。我使用自制软件进行安装,我认为这相当于作者的第3步,因为我在构建时必须指定“-framework OpenGL”

[编辑]

因此,NSAutoreleaseNoPool()问题应该通过以下三个步骤来解决:

  • main()应具有以下签名:int main(int argc,char*argv[])
  • #包含在main()所在的源文件中
  • 链接到-lSDLmain
  • 结果是SDL将使用NSAutoreleasePool和我的main周围的所有内容来包装它自己的main()。但是,当我执行此操作时,会出现如下错误:


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

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

    
    while(1)
    {
        NSAutoreleasePool* pool = [NSAutoreleasePool new];
    
        // Do your event processing
    
        [pool drain];
    }
    

    OSX Darwin 10.6.0,SDL 1.2.14好的,结果表明,与-lSDLmain链接,执行#include并具有“int main(int argc,char*argv[])签名,将导致SDL用使用自动释放池的Objective-C main包装程序的main。然而,我现在看到了奇妙的新问题!我会更新我的帖子。你的回答是正确的。问题是:我使用了一些过时的技术在XCode中设置SDL项目,所以这并不是“自动”发生在我身上的