代码之家  ›  专栏  ›  技术社区  ›  user142019

如何使dock重新加载所有dock tile插件?

  •  1
  • user142019  · 技术社区  · 16 年前

    我正在制作一个使用dock tile插件的应用程序。但是,当我重新编译dock tile插件时,dock仍然使用旧插件,即使我 killall

    3 回复  |  直到 16 年前
        1
  •  2
  •   user142019 user142019    16 年前

    我使用NSAlert和可访问性检查器发现一个名为SystemUIServer的进程负责dock tile插件。只要做:

    $ killall SystemUIServer
    

        2
  •  2
  •   SG1    15 年前

    - (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
  •  -1
  •   James Boutcher theomega    15 年前

    回到苹果关于这个主题的文档:

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

    我发现,如果你从苹果的文档中直接选择“退出”,这些插件就不会逗留,而且卸载也很干净。不过,我觉得这样做有点脏(并就此向苹果提交了反馈),因为我相信我的退出(0)也会导致其他应用程序的docktileplugins被重新加载。(我想使用killall Dock/SystemUIServer也一样)

        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
        }