1

ドック タイル プラグインを使用するアプリケーションを作成しています。ただし、ドック タイル プラグインを再コンパイルすると、ドックを使用している場合でも、ドックはまだ古いものを使用しkillallます。これを修正する唯一の方法は Mac を再起動することですが、コードを少し変更するたびに再起動したくありません。また、ドック タイル プラグインのドキュメントも不十分です。誰でも私を助けることができますか?

4

3 に答える 3

2

「ActivityMonitor」でもこれを行うことができます。「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
于 2011-07-30T15:27:40.483 に答える
2

NSAlert と Accessability Inspector を使用して、SystemUIServer と呼ばれるプロセスがドック タイル プラグインを担当していることがわかりました。ただ行う:

$ killall SystemUIServer

これにより、SystemUIServer が再起動され、ドック タイル プラグインがリロードされます。

于 2010-10-11T21:18:06.880 に答える
-1

私は最近これと戦っていますが、Dockプロセスを強制終了することもSystemUIServerプロセスを単独で強制終了することもできなかったようです。私はそれらの両方を殺さなければなりませんでした。

このテーマに関するAppleのドキュメントに戻る:

アプリケーションがDockから削除されると、setDockTile:メソッドがnilパラメーターを指定して呼び出されます。setDockTile:メソッドは、Dockタイルオブジェクトを解放し、Dock Tileプラグインが割り当てたリソースをクリーンアップして、終了する必要があります。

Appleのドキュメントから文字通り「そして終了」すると、これらのプラグインは長続きせず、アンロードはクリーンであることがわかりました。私のexit(0)が他のアプリのdocktilepluginsもリロードしていると思うので、これを行うのは少し汚いです(そしてこれについてAppleにフィードバックを提出しました)。(私は、killall Dock / SystemUIServerに頼る必要があると思います)

ドキュメントもあいまいに見えます...次にAppleがプロセスを強制終了するときに、優れたメモリ管理を行い、オブジェクトを解放することを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
    }
于 2011-10-08T16:05:14.400 に答える