【问题标题】:How to make the dock reload all dock tile plugins?如何让码头重新加载所有码头瓷砖插件?
【发布时间】:2010-10-11 17:44:08
【问题描述】:

我正在制作一个使用 Dock tile 插件的应用程序。但是,当我重新编译我的 Dock tile 插件时,Dock 仍然使用旧的,即使我 killall Dock 时也是如此。解决此问题的唯一方法是重新启动我的 Mac,但我不想为我所做的每一个小代码更改都重新启动它。此外,停靠磁贴插件的文档记录也很差。谁能帮帮我?

【问题讨论】:

    标签: cocoa macos dock


    【解决方案1】:

    我发现使用 NSAlert 和 Accessability Inspector 一个名为 SystemUIServer 的进程负责停靠磁贴插件。做吧:

    $ killall SystemUIServer
    

    这将重新启动 SystemUIServer 并重新加载停靠图块插件。

    【讨论】:

      【解决方案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
      

      或(推荐)

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

      【讨论】:

        【解决方案3】:

        我最近一直在与此作斗争,似乎自己杀死 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
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多