macOS版 ファイルオープンパネルがフリーズする
macOS 11 (Big Sur)までは事象が発生していなかったことから、OS側の問題か仕様変更と思われる。 NSOpenPanelオブジェクトを再利用せず、ファイルオープンパネルを表示するたびに NSOpenPanelオブジェクトを生成しなおすように修正したところ、事象が発生しなくなった。
ファイルオープンパネルを開くたびにNSOpenPanelオブジェクトを生成しなおすように修正する。
ファイルオープンパネル初期化処理を追加。
ファイルオープンパネル初期化処理を追加。
ファイルオープンパネルクラスにリリースメソッドを追加。
処理内容をリリースメソッドの呼び出しに差し替え。
リリースメソッド呼び出しを追加。 初期化メソッドの呼び出しにより、メンバのNSOpenPanelオブジェクトを再生成するため、 事前にメンバオブジェクトをリリースする。
今回の対策で明らかになった潜在不良。 MTFileOpenPanelクラスのInitializeメソッドを複数回呼び出すと、次の行でメモリ不正アクセスが発生し、アプリが落ちる。 エンコード名nameRefが壊れているため。
[pDictionary setObject:pEncodingId forKey:(NSString*)nameRef];エンコーディング一覧をリスト化するとき、CFStringGetNameOfEncodingを用いて取得した エンコーディング名の文字列を都度リリースしていたが、 オーナーではないので文字列をリリースするのはNGであり、メモリ破壊を引き起こしていた。 以下のリリース処理を削除した。
CFRelease(nameRef);
Fileメニューから「Open File...」または「Open Folder...」を選択してファイルオープンパネルを開くと、 1回目は問題なく使用できるが、2回目の表示でフリーズする。 マウスによる操作ができず、アプリを終了することしかできない。
macOS Montereyのバージョン12.2と12.2.1で事象の発生を確認した。 どのバージョンから発生していたのかは不明。