我正在制作一个使用 Dock tile 插件的应用程序。但是,当我重新编译我的 Dock tile 插件时,Dock 仍然使用旧的,即使我killall
在 Dock 时也是如此。解决此问题的唯一方法是重新启动我的 Mac,但我不想为我所做的每一个小代码更改都重新启动它。此外,停靠磁贴插件的记录也很差。谁能帮我?
3 回答
我使用 NSAlert 和 Accessability Inspector 发现一个名为 SystemUIServer 的进程负责停靠磁贴插件。做就是了:
$ killall SystemUIServer
这将重新启动 SystemUIServer 并重新加载停靠图块插件。
您也可以在“活动监视器”中执行此操作。搜索“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
或(推荐)
NSLog(@"MyApp: killed Dock plugins: %d", [NSApp killall:@"com.apple.dock.extra"]); //Comment out for release
我最近一直在与这个作斗争,似乎自己杀死 Dock 进程或 SystemUIServer 进程都没有成功;我不得不杀了他们两个。
回到 Apple 关于这个主题的文档:
当您的应用程序从 Dock 中移除时,将使用 nil 参数调用 setDockTile: 方法。你的 setDockTile: 方法应该释放 Dock tile 对象,清理你的 Dock Tile 插件分配的所有资源,然后退出。
我发现,如果您从字面上理解 Apple 文档中的“并退出”,这些插件就不会逗留,并且卸载是干净的。不过,我觉得这样做有点脏(并已就此向 Apple 提交了反馈),因为我相信我的 exit(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
}