OSDN Ticket Archive


Ticket #43853

macOS版 ファイルオープンパネルがフリーズする

登録: 2022-02-13 23:41 最終更新: 2022-02-13 23:44

報告者:
yknk
担当者:
yknk
チケットの種類:
バグ
状況:
完了
コンポーネント:
MIDITrail Ver.1.3.x for macOS
マイルストーン:
Version 1.3.5 for macOS (完了済み)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

Fileメニューから「Open File...」または「Open Folder...」を選択してファイルオープンパネルを開くと、 1回目は問題なく使用できるが、2回目の表示でフリーズする。 マウスによる操作ができず、アプリを終了することしかできない。

macOS Montereyのバージョン12.2と12.2.1で事象の発生を確認した。 どのバージョンから発生していたのかは不明。

チケットの履歴

2022-02-13 23:41 更新者: yknk
  • 新しいチケット "macOS版 ファイルオープンパネルがフリーズする" が作成されました
2022-02-13 23:42 更新者: yknk
コメント

原因

macOS 11 (Big Sur)までは事象が発生していなかったことから、OS側の問題か仕様変更と思われる。 NSOpenPanelオブジェクトを再利用せず、ファイルオープンパネルを表示するたびに NSOpenPanelオブジェクトを生成しなおすように修正したところ、事象が発生しなくなった。

2022-02-13 23:44 更新者: yknk
コメント

対策

ファイルオープンパネルを開くたびにNSOpenPanelオブジェクトを生成しなおすように修正する。

MIDITrailApp::OnMenuOpenFile

ファイルオープンパネル初期化処理を追加。

MIDITrailApp::OnMenuOpenFolder

ファイルオープンパネル初期化処理を追加。

MTFileOpenPanel::_Release

ファイルオープンパネルクラスにリリースメソッドを追加。

MTFileOpenPanel::~MTFileOpenPanel

処理内容をリリースメソッドの呼び出しに差し替え。

MTFileOpenPanel::Initialize

リリースメソッド呼び出しを追加。 初期化メソッドの呼び出しにより、メンバのNSOpenPanelオブジェクトを再生成するため、 事前にメンバオブジェクトをリリースする。

MTStringEncodingList::Initialize

今回の対策で明らかになった潜在不良。 MTFileOpenPanelクラスのInitializeメソッドを複数回呼び出すと、次の行でメモリ不正アクセスが発生し、アプリが落ちる。 エンコード名nameRefが壊れているため。

[pDictionary setObject:pEncodingId forKey:(NSString*)nameRef];
エンコーディング一覧をリスト化するとき、CFStringGetNameOfEncodingを用いて取得した エンコーディング名の文字列を都度リリースしていたが、 オーナーではないので文字列をリリースするのはNGであり、メモリ破壊を引き起こしていた。 以下のリリース処理を削除した。
CFRelease(nameRef);

2022-02-13 23:44 更新者: yknk
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました

添付ファイルリスト

添付ファイルはありません