deprecated対応は終了
今はTiExtenderの更新開発フェーズで、まず、Xcodeを最新版に更新して現行版のソースをビルドすると山の様にdeprecated関連のワーニングが出た。その対応は、一応、終わらせたので、ここからが本番だ。
出ていたdeprecated関連のワーニングの多くは、昨日書いた様に、単に、書き方の問題! みたいな話だった。
例えば、従来は、「NSLeftMouseDownMask」と記述していた定数はdeprecatedになったので、「NSEventMaskLeftMouseDown」と、記述しなければならなくなった。
変更作業には手間暇がかかるのに、そんな馬鹿みたいな変更なんてする訳ないだろう! と、思う人もいるかもしれないので、Appleの当該ページへのリンクを以下に載せておく。
NSEventMask | Apple Developer Documentation
と、言う事で、作者的には、Appleのエンジニアが「新しい記述の方が分かりやすいでしょ? どやああああ!」みたいな感じで、ドヤ顔しているのが目に浮かぶ訳なのだが、macOS向けにソフト開発している人なら、既に経験済みだと思われるのだが、上記の様な変更は、多岐にわたる訳だ。
つまり、従来の定数名は短すぎたので、どのグループに関連する定数なのか分からないので、定数名の中にグループ名を入れる事にした!! みたいな変更が行われた感じなので、実際の所、上記の様な変更は一つや二つではない。
なので、次バージョンのTiExtenderでは、機能的に変更がない箇所についても、膨大な変更を行う事になったので、何の問題もなかった機能が、何故か動作しなくなっている可能性も否定できない。
しかしまあ、上記は、ある意味、Appleの方針なので、動作しなくなった機能があったら、これもMacを使っているんだから仕方ないか、と、思ってもらいたい今日この頃だ。
ちなみに、上記以外の変更で多かったのは、sprintfというC言語の関数だ。
sprintfという関数は、巷では、まだまだ現役で、当然、Windows向けソフトでも使っているのだが、何故か、最新のXcodeでは使っているとワーニングが出る様になった。
つまり、Apple的には、巷で普通に使えているsprintfという関数についても、macOS向けソフトでは不推奨にした訳なのだが、それでは、代わりにどんな関数なら使えるのか、というと、Windowsなんかだと、sprintf_sというのがあるのだが、macOSでは、それも使えない感じで、ワーニングが出ずに使えた代替関数は、snprintf、という事になる。
この関数では、出力バッファのサイズを指定しなければならないので、普通に鑑みれば、その指定が必要ないsprintfよりは安全、と、考えるかもしれないのだが、普通、sprintfの様な関数を使う人は、バッファオーバーフローを常に意識している訳だ。
つまり、sprintf用の出力バッファのサイズは、必要なサイズで定義してある訳なのだが、snprintfを使う為には、そのバッファサイズを指定しなければならないので、変更するにあたって、過去に定義して忘れてしまっているバッファサイズを調べて、再度、明示的に入力しなければならなくなる。
なので、そのサイズ入力を間違うと、今まで問題なく出力できていた文字列が、短くなったり、逆に、作者的には面倒なので調べていないのだが、実装によっては、存在しないバッファに対する初期化等が行われ、指定したバッファサイズが実際よりも大きいと、存在しないメモリへの書き込みが発生して動作が不安定になり、たまにクラッシュしたりする! なんて現象が出る可能性もある。
似た様な話として、Javaでプログラムを書いていた時に、Javaにはnewはあってもdeleteはないから、変数のdelete忘れがなくなって安全! なんて事は全くない! という事を書いた事もあった筈だ。
つまり、CやC++の場合、一箇所でdeleteを行えば、確実にメモリ領域を解放できるのだが、Javaの場合、その領域を使っている全ての変数にNULLを代入しない限り、メモリ領域は解放されないので、どちらの方がメモリリークの危険性が高いか、といえば、Javaの方だ! みたいな事も書いた事があった。
と、言う事で、今更、sprintfをsnprintfに書き換えると、上記の様な問題が多発する可能性もあるので、作者的には、やりたくはなかったのだが、作者製ソフトでは、かなりの数のsprintfを使っているので、放置していると、ワーニングが多くなりすぎて、より危険性が高いワーニングを見落としてしまう可能性が高くなる。
なので、sprintfについても、致し方なく、snprintfに変更したので、次バージョンでは、文字列が表示される筈のタイミングでクラッシュする! みたいな不具合が出てきても可笑しくないかもしれない。
上記以外の大物としては、OpenGL関係の関数が全てdeprecatedになっているのだが、Apple的にも、流石にそれは通らないと分かっているのか、OpenGL関係のdeprecatedに対しては、それらだけを警告表示しないオプションを用意してあったので、それを使ってワーニングを消した。
もっとも、上記のオプションを使っても消えないワーニングが幾つか残っているのだが、まあ、数個程度なら、大した問題ではないので、そのままにして、deprecated対応については、作業終了! という事にした今日この頃だ。

