2011-02-17 83 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]; 
}