SDL + OpenGL в OSX: NSAutoreleaseNoPool () - PullRequest
0 голосов
/ 17 февраля 2011

Я работаю над кроссплатформенным кодом с использованием OpenGL и SDL, но сразу столкнулся с проблемами в Mac OSX.

Для справки, вот кодовая база на GitHub: https://github.com/GrooveStomp/platformer

Я также выдвинул ошибки, которые я вижу в том же репо: https://github.com/GrooveStomp/platformer/blob/master/errors.txt

Теперь, из прочитанного мною чтения, кажется, что SDL просто оборачивается Objective-C Mac OSXСлой какао и мне нужно объявить мой собственный NSAutoreleasePool, чтобы обернуть всю мою программу.Это правильно?

Я только что натолкнулся на эту ссылку: http://sourceforge.net/apps/wordpress/paintown/2010/12/26/sdl-and-osx/, в которой автор устанавливает из исходного кода и не имеет проблем.Я установил с помощью Homebrew, что, я полагаю, эквивалентно шагу №3 автора, так как при сборке я должен указать "-framework OpenGL".

[EDIT]

Итак, получаетсячто проблема NSAutoreleaseNoPool () должна быть решена, выполнив следующие три шага:

  1. main () должна иметь эту сигнатуру: int main (int argc, char * argv [])
  2. # включаютв исходном файле, где main () - это.
  3. ссылка с -lSDLmain

В результате SDL обернет свой собственный main () с помощью NSAutoreleasePool и всего моего main.Однако, когда я делаю это, я получаю ошибки, показанные здесь:

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

1 Ответ

1 голос
/ 17 февраля 2011

При отправке сообщения Objective-C в потоке без установленного NSAutoreleasePool вы получаете сообщение о том, что память «просто вытекает». Проблема с обертыванием всей программы в пуле автоматического выпуска состоит в том, что она никогда не истощается, и вы рискуете исчерпать память. Вместо этого создайте пул в начале цикла событий и опустошите в конце каждой итерации. Это правильное место должно исправить все ошибки "Just Leaking".

Поскольку объекты NSAutorelasePool не являются обычными объектами, их правильное использование немного отличается от почти всех других объектов Какао. Вот образец:


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

    // Do your event processing

    [pool drain];
}
...