おそらく-10.6 のコードの一部に、あなたの問題と疑わしいように聞こえる問題があることに気付きました。
完全に非同期でネットワーク情報 (主に BGP と AS に関するもの) を取得する必要がありました。私にとって理想的な解決策は、特別な DNS TXT レコード リクエストをパブリックにアクセス可能な DNS サーバーに送信することですが、Cocoa/Core Foundation は、この種の奇妙な DNS リクエストを行うための API を提供していません。別の方法はshell% whois -h IP 'SPECIAL REQUEST'
、出力から関連情報を使用して解析することでした。これは、数時間で起動して実行し、後で戻って実際のソリューションを導入できるものでした. 非常にハックですが、1) 適切な非同期 DNS ライブラリを見つけること、および 2) その API を使いこなし、場合によってはそのラッパーを作成することよりもはるかに高速です。
そこで、バックグラウンド スレッドをフォークしNSTask
てwhois
リクエストを開始するクラスを作成しました。バックグラウンド スレッドはNSRunLoop
結果を処理するためにループにとどまりますが、1/10 秒ごとにチェックNSTask
して、何らかの理由で停止したかどうか、または[NSThread isCanceled]
などを確認します。また、NSApplicationWillTerminateNotification
通知を登録するため、アプリは終了しています。
さて、10.6 の時点で...「すぐに」終了できなくなりました。10.5 では、すべてが滑らかで、少なくとも知覚的にはアプリが即座に終了します。10.6 では、終了するとアプリが「ハング」します。whois NSTask
デバッグは、長引くsをクリーンアップしようとしてすべてがハングアップしていることを示しました。この方法で取得した情報はどれもアプリの機能にとって重要ではないため (余分な情報であり、そのような情報を知っておくと便利です)、一時的な解決策として情報を取得しようとするのをやめました。
問題をデバッグする際のクイック パスは、メイン アプリがインスタンスを取得しようとしてブロックされていることを示していましたNSLock
。興味深いのは、そのままにしておくと、アプリケーションは最終的に正常に終了するということです.10〜20秒から数分.. 10.5と10.6の間で何かが変更され、[NSLock lock] ... [NSLock unlock]
ブロック内に括弧で囲まれたコードが「時間がかかる」. 私はまだそれがどこで起こっているかを追跡する必要があります(まだ優先事項ではありません)....しかし、それらの1つは、バックグラウンドがNSTask
まだ実行されている場合はバックグラウンドを終了し、安全に取り除く前に「終了するのを待っています」。そのようなものNSPipe
。
DUP : これはだまされた答えかもしれません...私の最初の答えはどちらかに消えてしまったようです?