Как сделать так, чтобы док перезагружал все плагины Dock Tile? - PullRequest
1 голос
/ 11 октября 2010

Я делаю приложение, которое использует плагин Dock Tile.Однако, когда я перекомпилирую свой плагин плитки док-станции, док все еще использует старый, даже когда я killall док.Единственный способ исправить это - перезагрузить мой Mac, но я не хочу перезагружать его после каждого небольшого изменения кода, которое я делаю.Кроме того, плагины док-панели плохо документированы.Кто-нибудь может мне помочь?

Ответы [ 3 ]

2 голосов
/ 30 июля 2011

Вы также можете сделать это в «Мониторе активности».Найдите «док» и принудительно завершите com.apple.dock.extra вручную.Это альтернатива «мыши» для опции «клавиатуры», описанной выше, и она не наносит такого большого побочного ущерба.

Я бы предположил, что во время разработки для частых изменений кода вы могли бы обернуть вышеупомянутыекоманда в задаче Какао:

- (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
2 голосов
/ 12 октября 2010

Я узнал с помощью NSAlert и Accessability Inspector, что процесс под названием SystemUIServer отвечает за плагины док-панели.Просто выполните:

$ killall SystemUIServer

Это перезапустит SystemUIServer и перезагрузит плагины док-панели.

0 голосов
/ 08 октября 2011

Я недавно боролся с этим, и похоже, что ни убийство процесса Dock, ни процесс SystemUIServer сами по себе не сделали этого; Я должен был убить их обоих.

Вернуться к документации Apple по этому вопросу:

Когда ваше приложение удаляется из Dock, метод setDockTile: вызывается с параметром nil. Ваш setDockTile: метод должен освободить объект плитки Dock, очистить все ресурсы, выделенные подключаемым модулем Dock Tile, и завершиться.

Я обнаружил, что если вы буквально берете «и выходите» из документов Apple, эти плагины не задерживаются и выгрузка чистая. Хотя я чувствую себя немного грязно, когда делаю это (и отправляю отзыв об этом в Apple), потому что я считаю, что мой выход (0) вызывает перезагрузку подключаемых модулей других приложений. (Я думаю, что нужно прибегнуть к 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
    }
...