問題タブ [nsapplication-delegate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - Cocoa アプリケーションの終了を適切に処理するには?
だから、ここに私の場合があります:
非標準のドキュメント ベースのアプリケーションを開発しており、いずれかのドキュメントに未保存の変更がある場合に終了を中止するシナリオを処理したいと考えています。
私の最初のアイデアは次のとおりです。
- ユーザーがアプリケーションを終了しようとします (
"Quit XXXXX"
メニュー項目または"X"
ボタンをクリックして) - 変更されたドキュメントはありますか?
- いいえの場合: 終了
- YES の場合: 変更されていないドキュメントがあることをユーザーに通知します。彼が続行したい場合は、終了します。そうでなければ、終了をキャンセルします。
そこで、デリゲート方式で行うことにしました。
私の Application delegateでは、次を実装しました。
-windowToClose:
(トリガーNSWindowWillCloseNotification
)applicationShouldTerminate:
applicationShouldTerminateAfterLastWindowClosed:
今、それが私が考えていることです。applicationShouldTerminate:
メソッド内:
NSTerminateNow
変更されたドキュメントが存在しない場合に返すNSTerminateCancel
変更されたドキュメントがある場合に返します。その場合、アラート シートなどをポップアップ表示し、ユーザーが終了したいことを確認したら、[NSApp terminate:nil];
それは正しい方法ですか?
助言がありますか?
objective-c - アプリのグローバルリソースをクリーンアップするのに最適な場所ですか?
retainCount
次の質問の単語が表示される前に、[OK ]を押してください。使用を停止したと述べた下部の[編集]にスキップしてください。
MRRを使用する私のCocoaアプリは、呼び出されるmain()
前に、ロードしている多くのグローバルリソースを作成します。戻らないので、次のように、を使用してこれらのリソースのクリーンアップをフックしましNSApplicationMain()
た。NSApplicationMain()
atexit()
ただし、サブクラスのビューが'dcleanup()
になる前に呼び出されるため(これを示すログメッセージがありません)、グローバルリソース内のオブジェクトの参照カウントが時々発生します。私は慎重すぎて、この方法を使用してグローバルリソースを解放することにより、メモリリークを回避しようとしています。NSDocument
dealloc
> 1
私のログには次のように表示されます。
私の質問(ついに!)は:
NSDocument
すべてのインスタンスが破棄された後、グローバルリソースを確実にクリーンアップして、これらのフォールスネガティブの取得を停止する方法はありますか?
編集:fullRelease
呼び出しのフックを解除し、リソースに対して通常の処理を実行しましたがrelease
、Instrumentsはメモリリークを検出しなかったため、問題はありませんが、呼び出されるNSDocument
前にオブジェクトが解放されていないように見える理由に興味があります。atexit()
objective-c - NSApplicationDelegate で application:openFile が YES ではなく NO を返すとどうなりますか?
私はObjective-C/Cocoaを学んでいて、open document
イベントの処理について読み始めました。標準的な方法は、実装application:openFile
またはapplication:openFiles
NSApplicationDelegate で行うだけのようです。
だからここに私の小さなハンドラーがあります:
私の質問は: ブール値の戻り値は何に影響しますか? それが重要な場合、これはドキュメントベースのアプリではありません。と を返す間に識別可能な違いは見られませYES
んNO
。Apple のドキュメントは何の助けにもなりません。明らかに、ファイルを開くイベントを正常に処理したかどうかを示すために YES または NO を返しますが、これら 2 つの結果の実際の結果はどうなるでしょうか?
また、デバッガーを使用してコール スタックをステップ実行して知識を収集できるほど、フレームワークに精通していません。
アプリをテストするために、Xcode から実行し (コールド スタートはまだ処理していません) $ open -a MyApp somefile.txt
、ターミナルでコマンドを実行し、Finder で [ファイル] > [アプリケーションで開く] を実行してアプリを選択します。
関連する質問ですが、別の問題について(未回答): application:openFile: after return でファイルを開くのが非常に遅い
xcode - ドキュメントが復元されない場合に新しい NSDocument を自動的に作成する方法は?
編集: 以下の問題は、Finder からではなく、Xcode 内 (私は 4.4) から実行したときにのみ発生するようです (むしろ、発生しません... :)。これは Xcode のバグですか、それとも何か不足していますか?
ドキュメントが自動的に復元されなかった場合に備えて、アプリの起動時に新しい (無題の) NSDocument を作成したいと考えています。TextEdit と Safari の両方が私が望む動作を表示するので、これを組み込むべきだと思われますが、そのためのオプションが見つかりません。
問題を再現するための手順: Xcode で新しいドキュメントベースのアプリを作成して実行すると、最初の実行時に無題のドキュメントが作成されます。しかし、そのドキュメントを閉じてアプリを終了し、再度実行すると、Dock のアプリ アイコンを明示的にクリックしない限り、新しいドキュメントは表示されません。これは、終了して再起動すると新しい空のドキュメントが作成される TextEdit などとは異なります。(バンドル識別子を変更すると、予想どおり、別の新しい無題のドキュメントが表示されます。)
私の最初の考えでは、これは で発生するのではないかと思いましたがapplicationDidFinishLaunching:
、以前に開いたドキュメントが復元される前に、そのメソッドが実行されることが判明しました。
cocoa - NSApplicationDelegateを使用しているときに、AppleのSimpleScriptingの例を機能させることができません
簡単なObjective-Cアプリケーションを作成しようとしています。ステータスバーに単語を表示し、AppleScriptを介して単語を更新できるアプリが必要です。正直なところ、私はAppleScriptについてはほとんど知らず、Objective-Cについても何も知りません。しかし、メニュー項目があり、「quit」などのコアAppleScriptコマンドに応答するメニューバーアプリを入手するのに2時間しかかからなかったので、それほど難しいことではありません。残念ながら、私は次の6時間かけて、このアプリケーションにAppleScriptを介して取得および設定できる単純なプロパティを与える方法を見つけようとしました。
これが私の.hコードです:
このfoobaz
メソッドは、読み取り可能なプロパティを作成するために使用していたものです(*window
XCodeによって提供された定型文の一部であり、当面の問題には関係ありません)。これが私の.sdefファイルです:
だから私はここでAppleのSimpleScriptingの例のようにセットアップしました:https ://developer.apple.com/library/mac/#samplecode/SimpleScripting/Introduction/Intro.html
ただし、スクリプトエディタでこれを実行してみました。
そして、Appleの例とは異なり、コアプロパティのリストを取得するだけで、foobaz
何も言及されていません。Appleの例では、カスタムプロパティを実行すると、コアプロパティの横に表示されます。
これについて100のバリエーションを試し、100の例を読んだように感じますが、何も機能しません。どんな助けでも大歓迎です。
objective-c - NSApplicationDelegate アプリケーション:openFile. openFile: 関数に到達しない
アプリのアイコンにドロップしてファイルを開きたい。これを行うと、アプリが開かれるため、ファイル拡張子が明確に定義され、アプリに関連付けられます。しかし、application:openFile:
関数は決して呼び出されません。アプリにドロップされたファイルを開くことができません。たどっopenFile:
たけど行かない。
私が見つけたすべての答えは、デリゲートを追加するだけで、openFile:
それがすべてですが、私の場合はそうではありません。
どんな助けでも大歓迎です。よろしくお願いします。
これが私の環境です。
plist には、開くファイルの拡張子があります。ファイルをドロップするとアプリが開きます。
アプリの開始時にデリゲートを初期化し、
そしてデリゲートでは、
インクルードで、
.m ファイルでは、
objective-c - アプリケーション終了時のクラッシュ
このクラッシュを解決するのを手伝ってくれる人はいますか? これは、アプリが終了したときに発生しますが、常にではありません。
終了時にクラッシュすると、次のクラッシュログが表示されることがありますが、これも常にではありません。