У меня есть плагин Cocoa, который загружается в существующее приложение Carbon.
Когда плагин загружается впервые, приложение Carbon вызывает функцию инициализации Plugin_Init()
, и в этой функции я настраиваю среду следующим образом:
//this is the global autorelease pool
static NSAutoreleasePool* globalPool = nil;
void Plugin_Init()
{
NSApplicationLoad(); //loads the Cocoa event loop etc
//create an autorelease pool
globalPool=[[NSAutoreleasePool alloc] init];
//callback functions are registered here
Plugin_defineFunction("doSomething",doSomething,0);
}
Однако приложение Carbon не отправляет никаких уведомлений, когда приложение собирается завершить работу.
Действительно ли необходимо очистить "глобальный" пул авто-релизов, который я создал, когда приложение закрывается?
Я попытался зарегистрироваться для события выхода из приложения Carbon, добавив вызов к функции registerForApplicationQuitNotification()
ниже, но когда приложение завершилось, я получил предупреждения о том, что я вызываю -release
в недопустимом пуле авто-выпуска. Есть ли проблема с тем, как я справляюсь с событиями Carbon?
//handles the Carbon application quit notification
static pascal OSStatus handleApplicationQuitEvent(EventHandlerCallRef nextHandler, EventRef evt, void *ud)
{
OSStatus err = noErr;
UInt32 evtkind;
evtkind = GetEventKind( evt );
if ( evtkind == kEventAppQuit )
{
//release the global autorelease pool
[globalPool release];
}
// call the rest of the handlers
err = CallNextEventHandler( nextHandler, evt);
return err;
}
//registers for the Carbon application quit notification
void registerForApplicationQuitNotification()
{
// install an event handler to tear down some globals on Quit
static EventHandlerUPP app = NULL;
EventTypeSpec list[] = {
{kEventClassApplication, kEventAppQuit},
};
app = NewEventHandlerUPP( handleApplicationQuitEvent );
if (!app)
return;
InstallApplicationEventHandler(app, GetEventTypeCount(list), list, NULL, NULL);
}