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