ドック タイル プラグインを使用するアプリケーションを作成しています。ただし、ドック タイル プラグインを再コンパイルすると、ドックを使用している場合でも、ドックはまだ古いものを使用しkillall
ます。これを修正する唯一の方法は Mac を再起動することですが、コードを少し変更するたびに再起動したくありません。また、ドック タイル プラグインのドキュメントも不十分です。誰でも私を助けることができますか?
3 に答える
「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
NSAlert と Accessability Inspector を使用して、SystemUIServer と呼ばれるプロセスがドック タイル プラグインを担当していることがわかりました。ただ行う:
$ killall SystemUIServer
これにより、SystemUIServer が再起動され、ドック タイル プラグインがリロードされます。
私は最近これと戦っていますが、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
}