Вопрос: Как создать NSAutoreleasePool без Objective-C?


У меня многоплатформенная игра, написанная на C ++. В версии для Mac, хотя у меня нет какого-либо obj-c-кода, одна из библиотек, которые я использую, по-видимому, является авто-выпуском, и я получаю утечки памяти для этого, так как я не создал NSAutoreleasePool.

Я хочу, чтобы иметь возможность создавать (и уничтожать) NSAutoreleasePool без использования obj-c-кода, поэтому мне не нужно создавать .m-файл и изменять сценарии сборки только для этого. Это возможно? Как это можно сделать?

OBS: Tagged C и C ++, потому что решение на любом из этих языков будет выполнено.


7


источник


Ответы:


Вы не можете избежать создания экземпляра Objective-C, но, видимо, у вас уже есть один из них.

Если вы хотите взаимодействовать с рабочей средой с C, вы можете использовать API-интерфейс Objective-C, как описано в Руководство по программированию времени выполнения Objective-C  а также Ссылка на объект Objective-C Runtime ,

Идея что-то вроде этого (непроверенная):

#include <objc/runtime.h>
#include <objc/objc-runtime.h>
id allocAndInitAutoreleasePool() {
  Class NSAutoreleasePoolClass = objc_getClass("NSAutoreleasePool");
  id pool = class_createInstance(NSAutoreleasePoolClass, 0);
  return objc_msgSend(pool, "init");
}
void drainAutoreleasePool(id pool) {
  (void)objc_msgSend(pool, "drain");
}

Если вы хотите вызывать эти функции из другого файла, вам, конечно же, придется включить objc / runtime.h. Или, альтернативно, вы можете использовать id для void * в возврате из функции allocAndInit и принять пустоту * и отбросить назад к id в функции стока. (Вы также можете переслать-объявить struct objc_object и typedef struct objc_object * id, но я считаю, что на самом деле это не гарантирует правильное определение.)

Вам не нужно передавать команду -lobjc в свою ссылку.

Излишне говорить, что, вероятно, меньше усилий, чтобы заставить скрипты сборки обрабатывать файлы .m.


2