SSブログ

macOS10.13でNSSavePanelが作れない [日常のあれやこれや]

先週自分のMacBook Pro、iMacとそれから本社にあるデモや調整用の設備に使っているMac mini数台を一斉に10.13に上げた。MBPはファイルシステムがAPFSに変わっていた。HDDやハイブリッドHDDはHFS+のままになってる。中身が入ったままファイルシステムを変更するなんてどうやるんだろう。HFS+とAPFSはi-nodeの構造が違うだけで、もとのHFS+の中身は保ったままi-nodeだけを書き換えるんだろうか。MBPのSSDは128GBで残り10GBぐらいでずっとやりくりしてるので、そんなやりかたでないと無理だよな。

まあそれはいいとして、10.13に落とし穴が待っていた。
    NSSavePanel *savePanel = [NSSavePanel savePanel];
ただこれだけで、クラッシュする。最終的に__NSDictionaryMという内部クラスのオブジェクトにnilが代入されることで例外が発生していた。こんなのごく普通に使ってきたので、まさかこれだけでダメになるなんて思ってもなかった。たしかに10.12でも特定の設備用アプリでsave panelを作るたびにlogに変なゴミが溜まっていくな、とは思っていた(関係ない文字列でキー値コーディングを呼んだ、というんだけど僕の知らない文字列ばかり)。けどそれでも動いていたのでそのうちによく見よう、と思いながらほったらかしになっていた...

save panelをappDelegateの-applicationDidFinishLaunching:メソッドの頭で作っても同じ。+loadメソッドでrun timeを壊してるのか、と思ったんだけど+loadを使ってる(自前定義してる)クラスは引き金になるファイルにはなかった。static変数をなくしたり、+initializeをなくしても同じ。クラスオブジェクトが存在するだけで(インスタンスがなくて一度もコードが実行されなくても)クラッシュが起きる、ということになる。

僕の書いたアプリでそれが起こるのはその設備用の一つだけなんだけど、それは実行時のホストやコンパイル場所によらない。そのアプリにある特定のobjective-Cファイルを含めるとどのアプリでもクラッシュする。ところがクラッシュの原因らしいファイルはひとつではなくていくつもある。中には一つだけだとsave panelがちゃんと作られるものもあるけど、他のを含めるとダメだったりする。クラッシュを引き起こすファイルは別にどうということもないNSErrorのサブクラスを書いたものや、UDPでブロードキャストするためのsocketを書いたものなど、てんでんバラバラ。

developer forumやstackOverflowを見るとsandboxとの関係で似たようなことが報告されていた。僕のコードをsandboxのありなしで試して見ると、stack traceで出てくるクラスは変わるんだけど、最終的には似たような例外が発生してやはりクラッシュする。

そのほかで報告例は見当たらないので、僕が原因のようなんだけど、何が問題なのか特定できない。工場の設備に使ってるMac miniは上げないようにしよう。でもどのMac miniも最小限のメモリしかないのでXcodeを立ち上げるのさえつらい。後回しにしたツケの報いではあるけど、よくわからなくて焦ってきた。困った。
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。