SSブログ

近況報告 - その4 [日常のあれやこれや]

前回まででどういう状況にあるか、という話はし終わった。今回はMacアプリの開発環境の整備について。これで近況報告は終わり。

とうとうMacのデベロッパプログラムに登録した。野良デベロッパはやりにくくてしょうがなくなっていた。Xcode4からはSandboxがせっかくあるのに使えないし、iTunes Library FrameworkをはじめとしてリンクできないFrameworkがでてきた。Xcode5からはリリース版のビルドもすなおにはできなくなって、インストーラの形式も作れなくなった(アーカイブ形式でしかビルドできない)。

こんなものに年間何千円もはらうのはバカバカしいとずっと思っていた(もちろんXcodeが何万円もしたら別だった)んだけど、不便でしょうがないし、かといってXcode以外の開発環境を1から勉強し直すのも大変だし、ましてやいまさらWindowsやLinuxなんかの違うプラットフォームに乗り換えるなんてこともできない。もうCocoa/Objective-Cの簡単さになれきってしまってるし、Xcodeの乳母日傘にスポイルされきってしまっている。Cocoaジャンキー、Xcode廃人とでも言える状態。社会復帰して真っ当な生活をするなんてことはもう望めない。

ということで、会社を辞めれば時間もできてじっくりアプリが書けるだろうと思って、消費税が上がる前の3月末に登録した。原資には娘からもらったお年玉を投入した。登録はあっという間に終わって数日でAppleから登録完了のメールが来た。WindowsやLinuxではどうなってるんだろう、とちょっと思ったけど、Windowsだと同様のことがもっと安いとしてもそのせいで乗り換えるというのはないので、スルーした。

それはいいんだけど、Certificateが何種類もあってそれぞれどう違うのかよくわからないし、複数のマシンでXcodeを使うと、一方をRevokeしないともう一方で使えない。これがいったいなにをしているのかぜんぜんわからない。なにか勘違いしているようにも思えるんだけど、ProvisioningとかEntitlementとか難しい単語ばっかりで、いじっていてもぜんぜん理解が進まない。だれか教えて。

そうこうしているうちに、新しい会社に入ってドタバタして5月はぜんぜんXcodeをさわらずに過ごしてしまった。根が貧乏性なもんで、650円分無駄にした、と思ったけどどうしようもない。

デベロッパ向けリソースもちょっと見ない間にどんどんドキュメントが追加されている。全然追いつかない。たとえばいつの間にかクラス名のプレフィクス(Objective-Cには名前空間がないので、NSObjectのNSのように短い文字列を付け加えて衝突を避ける)として、二文字はAppleが予約となっている。つまりサードパーティはプレフィクスを三文字にしろ、ということ。これはもうずいぶん前からなのか。知らなかった。

AppleはつぎつぎFrameworkを追加して、それぞれが違うプレフィクスを持っている。アルファベット二文字では全部で676通りしかないのでこの調子では衝突の確率が無視できなくなる、と思ったんだろう。三文字では17576通りなのでたくさんありそうだけど、サードパーティどうしの衝突の確率が十分低いとは言えない。

とかいいながらOS X10.10で導入されるSceneKitのプレフィクスはSCNで、すでに三文字に侵入してる。やっぱり名前空間がそのうち導入されるのかな。名前空間は衝突の確率が下げられて(しかし0にはならない)記述も簡単になるけど、名字の違う(名前空間の異なる)同じ名前の関数が出てくると、やっぱり混乱する。善し悪しだわな。

比較的新しいサンプルコードではARCがあたりまえで、インスタンス変数がなくて全部プロパティ宣言になっているのが増えている。またブロックも多用されている。さらに.mファイルに
@interface SOMeClass ()
@property OTHerClass  *otherObject;
- (id)anotherMethod;
....
@end
@implementation SOMeClass
...
@end
なんていう書き方をみつけた。なにこれ?無名カテゴリが宣言できて、そこだとプロパティが追加できるらしい。これまであまり使わなかったけど、implementationの先頭にインスタンス変数が追加できるのでそれと同じメカニズムだろう。ヘッダファイルのインクルードの連鎖を切るためには便利な書き方だ。

以前OpenCVのC++コードをラップするObjective-Cのクラスを作ったときに、そのヘッダをインクルードするファイルはObjective-C++としてコンパイルしないといけなくなった。そのときはそれを避けるためにOpenCVのC++オブジェクトをそのヘッダではvoid*宣言した。そういうやりかたよりはずっとスマートになる(例えばこれはまさしく、OpenGLのヘッダを読み込ませないために使っている)。でもこれを使うと(implementation内でのインスタンス変数宣言と同じだけど)当然プロパティ宣言がヘッダと実装の2カ所に分裂してしまう。まあしかし分裂が問題になるのは.mファイルを見ている場合だけだし(そのときはファイルの先頭を見ればいいということ)、情報隠蔽という意味ではむしろ望ましいということだろう。

やっぱりそう言う新しい言語要素(最近の人からはちっとも新しくない、と言われるかもしれないけど)に慣れていかないといけない。古い構文は実行効率も悪いだろうし。
ちょっとがんばろ。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

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