如何让Dock重新加载所有的dock tile插件?

时间:2010-10-11 17:44:08

标签: cocoa macos dock

我正在制作一个使用dock tile插件的应用程序。但是,当我重新编译dock tile插件时,Dock仍然使用旧的,即使我killall停靠。解决这个问题的唯一方法是重新启动我的Mac,但我不想为我所做的每一个小代码更改重启它。此外,Dock tile插件的文档记录很少。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

我发现使用NSAlert和Accessability Inspector,一个名为SystemUIServer的进程负责dock tile插件。只是做:

$ killall SystemUIServer

这将重新启动SystemUIServer并重新加载dock tile插件。

答案 1 :(得分:2)

您也可以在“活动监视器”中执行此操作。搜索“dock”并强制手动退出com.apple.dock.extra。这是上面“键盘”选项的“鼠标”替代方案,并没有造成太大的附带损害。

我建议在开发期间,为了频繁更改代码,可以将上面的命令包装在Cocoa任务中:

- (BOOL)killall:(NSString *)process {
    //Configure
    NSString *toolPath = @"usr/bin/killall";
    NSArray *arguments = [NSArray arrayWithObject:process];

    //Create
    NSTask *task = [[[NSTask alloc] init] autorelease];
    [task setLaunchPath:toolPath];
    [task setArguments:arguments];

    //Run
    [task launch];
    [task waitUntilExit];

    //Return success
    return ([task terminationStatus] == 0);
}

将它放在NSApplication的类别中,执行方式如下:

NSLog(@"MyApp: killed UI Server: %d", [NSApp killall:@"SystemUIServer"]); //Comment out for release

OR(推荐)

NSLog(@"MyApp: killed Dock plugins: %d", [NSApp killall:@"com.apple.dock.extra"]); //Comment out for release

答案 2 :(得分:-1)

我最近一直在与此作斗争,似乎既没有杀死Dock进程也没有杀死SystemUIServer进程。我不得不杀了他们俩。

返回Apple关于此主题的文档:

  

当您的应用程序从Dock中删除时,将使用nil参数调用setDockTile:方法。你的setDockTile:方法应该释放Dock tile对象,清理你的Dock Tile插件分配的所有资源,然后退出。

我发现,如果你从Apple的文档中取出“并退出”字面意思,这些插件不会徘徊,卸载是干净的。我觉得这样做有点脏(并且已经向Apple提交了反馈)因为我相信我的退出(0)导致其他应用程序的docktileplugins也被重新加载。 (我想不得不求助于killall Dock / SystemUIServer做同样的事情)

这些文档看起来也很模糊......不确定为什么Apple会希望你做好内存管理的东西,并在你做下一件事就是杀死进程时释放对象。

    if(dockTile == nil) {
        NSLog(@"Docktile version %@ unloading", [[[NSBundle bundleForClass:[self class]] infoDictionary] valueForKey:@"CFBundleVersion"]);
        [_dockTile release], _dockTile = nil; // don't leak memory!
        exit(0); // ouch
    }