-泣く泣く歩むCocoaへの道-


 6.7ショック

 この2年ほど、遅ればせながらよろよろとソースのOSX化を勉強してきた。しかし、素人が学ぶ速度よりもMacの変化のほうが速くて、追いかけても追いかけても追いつかない。Carbon化して、Mach-O化して、Xcodeに移植して...。
 その過程で感じたのは、ToolBox関数やResource Managerリソースや旧来のイベントモデルやら従来のMacのアイデンティティーともいうべきものががどんどん隅へ追いやられていることである。そしてそれにかわって"NS"なんとかだの"n"ibリソースだのがどんどん主役になって来ている。ひょっとして、OSXへの道はNSによるMac纂奪の道なのでは? いや、これこそが「おじいさんのランプ」の世界なのか?
 この1か月ほど、Cocoaの勉強をしていた。もともとはCarbon Eventの勉強をしていたのだが、わかりやすい資料がなく、苦労する割に出来上がったものは素人目には旧来のイベントモデルのものと大差なく見える。(本当は違うのだろうけど...。) これならいっそ別の言語を学んだほうが...と思えてしまったからである。
 私はCarbonが好きだが、Cocoaを食わず嫌いしているのもなんなので、良い機会と思い参考書を2冊ほど読んだところであの2005.6.7ショックだ。
 Classicはアウト。CFMもアウト。Cocoaは王道、Carbonはまあセーフだが、外様扱い?(Resource Managerリソースはアウトではないようで、助かった。)Cocoaの勉強を開始していなかったらもっとショックは大きかった筈。
 以下は、泣く泣くCocoaの勉強をしている男のメモである。そのメモは誤りに満ちているというより、誤っていると思うのだが、手続き型言語しか知らない中年男がCocoaを独学すると、こう見えるということである。

どこにソースを書くのか?

 Cocoaの単純なアプリは以下の手順で作れる。

 Cocoa applicationの新規プロジェクトを作る。
 MainMenu.nibを改変してまずGUIを作る。
 NSObjectのsubclassを作り、MyBrainとか適当な名前をつける。
 (これがコードを書き込む中心となるが、アプリの種類によってはNSViewやNSDocumentのサブクラスがコード記述の中心になる場合もある。)
 それをメニューでインスタンス化する。
 GUI部品で、変化させたり値を得たりしたい部品にそれぞれ名前(Outlet)を考えておき、その名前をMyBrainにAdd Outletする。
 また、GUIの上でユーザーが操作する部品(ボタンとかメニュー項目とか)にそれぞれ名前(Action)を考えておき、その名前をMyBrainにAdd Actionする。
 (同じGUI部品にOutletとしての名前とActionとしての名前が同時に付き得る。)
 インスタンス化したMyBrainから各Outlet部品へ、Control+ドラッグで線を接続し、あらかじめつけておいた名前を割り当てる。
 各Action部品からMyBrainへ、Control+ドラッグで線を接続し、あらかじめつけておいた名前を割り当てる。
 メニューからMyBrainの記述ファイル、MyBrain.h(そのクラスが何の子孫であるかを宣言し、また、インスタンス変数やメソッド名を宣言する部分)とMyBrain.m(メソッドや関数を実際に記述する部分)を作る。
 それらのファイルの中で、Outlet名は各部品を参照するための変数であり、Action名はそれらがユーザーに操作された時に働く関数名である。
 Cocoaのプログラムとは、アプリや各クラスがあるタイミングで自動的に呼び出すメソッドや、ユーザーによる操作によって起こるActionメソッドを記述することである。
  objectiveCの記述は[インスタンス名 メソッド名];の羅列が中心になる。(主にインスタンスを作る際に使う[クラス名 クラスメソッド名];という構文もある。インスタンスとは設計図であるクラスからメモリーを確保して実体化した写しである。また、クラスはその拡張前の先祖となる別のクラスを拡張した子孫である。)
 メソッドとは関数のようなもので、引数や戻り値があったりなかったりするが、それを呼び出す主体(クラス名またはその実体化した写しであるインスタンス名)を先に記述せねばならず、クラス自体か、そのクラスの先祖のクラスに登録されているメソッドだけを呼び出して使うことが出来る。(また、引数の前にラベルというメソッド名の一部がつくのが最初は馴染みにくい。)
 先祖のメソッドに登録されているメソッドと同じ名前のメソッドを明示的に記述すると、先祖のメソッドは無視されて、子孫のメソッドが有効になる。
 アプリの初期化に必要なことは中心となる.mのawakeFromNibというメソッドの中に書き込む。(大雑把には、アプリはそこから始まる。)
 .mファイルの中で@implementよりも前にC言語の関数を書いておけば、そのファイルのメソッドの中でそのC言語の関数を呼び出して使える。また、Carbon/Carbon.hをimportしたり、適当なframeworkをaddすればCarbon関数を使うこともできる。
 
(工事中)

実際に いくつ v1.0cを書いてみて

 Cocoaの第一印象は難しいHyperCardという感じか。
 「いくつ」はこれ以上ないくらい単純な、夏休みの工作級のアプリなので、すぐできそうに思ったのだが、それでもNSStepper、NSFormatter、NSTimer、NSUserDefaultsについていろいろ調べないと書けなかった。
 ひょっとしてCarbonの方が簡単なのでは? と感じるのは年のせいか...。

Carbonへの道-An Opaque Road To Carbon-
デラシネソフトのホームページへ戻る