Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在加载到Carbon应用程序中的Cocoa插件中处理应用程序出口_Cocoa_Macos_Events_Plugins_Macos Carbon - Fatal编程技术网

在加载到Carbon应用程序中的Cocoa插件中处理应用程序出口

在加载到Carbon应用程序中的Cocoa插件中处理应用程序出口,cocoa,macos,events,plugins,macos-carbon,Cocoa,Macos,Events,Plugins,Macos Carbon,我有一个Cocoa插件,它加载到现有的Carbon应用程序中 当插件首次加载时,Carbon应用程序调用一个初始化函数,Plugin\u Init(),在该函数中,我设置了如下环境: //this is the global autorelease pool static NSAutoreleasePool* globalPool = nil; void Plugin_Init() { NSApplicationLoad(); //loads the Cocoa event loop

我有一个Cocoa插件,它加载到现有的Carbon应用程序中

当插件首次加载时,Carbon应用程序调用一个初始化函数,
Plugin\u 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 app quit事件,方法是向下面的
registerForApplicationQuitNotification()
函数添加一个调用,但当应用程序终止时,我收到警告,说我正在对无效的自动释放池调用
-release
。我如何处理碳排放事件有问题吗

//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);
}

如果自动释放池是您需要执行的唯一清理,则不需要注册退出通知。您创建的任何池仍在应用程序的地址空间内,当进程终止时,操作系统将释放该地址空间


此外,自动释放池通常为每个线程创建。如果在不同的线程上调用回调,则可能需要为每个线程创建一个池。注意,Cocoa还需要被告知它是在多线程环境中运行的;请参阅的线程部分。

如果自动释放池是您需要执行的唯一清理,则不需要注册退出通知。您创建的任何池仍在应用程序的地址空间内,当进程终止时,操作系统将释放该地址空间


此外,自动释放池通常为每个线程创建。如果在不同的线程上调用回调,则可能需要为每个线程创建一个池。注意,Cocoa还需要被告知它是在多线程环境中运行的;请参阅。

的线程部分,很可能是
NSApplicationLoad
设置了NSApplication的第一个自动释放池,该池将位于自动释放池堆栈中您的池的下方(因为它是最先创建的)。在后台,它将耗尽这个池,并根据需要创建一个新池;第一次发生这种情况时


简单的解决方案是切断您的全局池,让NSApplication创建它。另一种方法是在每个处理程序函数中创建和排出本地池,特别是当您实际上不需要插件中的应用程序工具包中的任何内容时。

很可能是
NSApplicationLoad
设置了NSApplication的第一个自动释放池,该池在自动释放池堆栈中位于您的池之下(因为它是第一个创建的)。在后台,它将耗尽此池并根据需要创建一个新池;第一次发生这种情况时


简单的解决方案是切断您的全局池,让NSApplication创建它。另一种方法是在每个处理程序函数中创建并排空本地池,特别是如果您实际上不需要插件中的应用程序工具包中的任何内容。

谢谢,这让我研究了如果我不创建自动释放会发生什么情况ool显式运行,事实上一切都很完美实际上管理自动释放池,尽管文档中没有明确说明这一点。谢谢,这让我调查了如果我没有显式创建自动释放池会发生什么,事实上一切都很好。似乎
NSApplicationLoad()
实际上管理自动释放池,尽管文档没有明确说明这一点。感谢关于多线程的建议,在这种情况下,对插件的调用总是在主线程上,因此只有我自己的线程需要管理自己的自动释放池。感谢关于多线程的建议,在在这种情况下,对插件的调用总是在主线程上,因此只有我自己的线程需要管理自己的自动释放池。