Cocoaでいこう! Macらしく 第6回
Yoshiki(DreamField)
この記事は、MOSAが発行するデベロッパ向けのデジタルマガジンMOSADeN 第65号(2003年5月13日発行)に掲載された記事です。2〜3ヶ月遅れで、ここに掲載して行きます。

前回は、TinyViewがファイルを開くと「書類のタイプ」で指定したクラス(今回の場合はMyDocumentクラス)がインスタンス化され、そのファイルの管理を任されることを説明しました。この部分はCocoaのフレームワークがやってくれますので、通常はプログラムを組む必要はありません。つまり、プログラムを組む上では、一つのファイルに対する処理だけを考えれば良いわけです。一気にプログラムが簡単になってしまいましたね。

データの受け取り方

それでは、MyDocumentにファイルのデータがどうやって渡って来るのか見てみましょう。MyDocument.mを開いて下さい。ソースをずーっと見て行きますと、一番下に次のようなメソッドがあります。

- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType

初めてObjective-Cを見た方は、この記述方法に馴染みが無いと思いますが、要素としてはC言語の関数とほとんどいっしょです。最初に書いてある(BOOL)は、このメソッドの戻り値を表します。このメソッドはYESかNOを返すわけです。「:」の後ろに付いている(NSData *)dataと(NSString *)aTypeは引数です。(NSData *)はNSDataクラスのインスタンスへのポインタで、これは任意のバイト列を格納するクラスです。(NSString *)はNSStringクラスのインスタンスへのポインタで、これは文字列を格納するクラスです。こんな風に引数を書いた方が、C言語の様にただ並べるよりも意味が分かりやすいと思うのですが、どうでしょうか。なお、このメソッドの名前ですがloadDataRepresentationでは無く、引数を除いてくっつけたものになります。すなわち、 loadDataRepresentation:ofType: です。

このメソッドのコメントを読めば分かりますが、ファイルを開くと、このメソッドが呼び出され、ファイルの中身が渡って来ます。引数のdataがファイルの中身そのものです。では、aTypeは何なのでしょうか?ただ説明を読んでいても面白く無いでしょうから、ここは一つデバッガで何が渡って来るのか見てみましょう。return YESの所にブレークポイントをセットして下さい。ブレークポイントはソースが表示されているすぐ左側をクリックすると、セットすることが出来ます(fig.01)。

ProjectBuilderのアイコン
[fig.01] ブレークポイントのセット

そして、左上のボタンの中から「ビルドとデバッグ」ボタンをクリックします。ビルド後、デバッガが立ち上がり、TinyViewが起動します。起動したらTinyViewの「ファイル」メニューから「Open...」を選び、Open Panelを開いて下さい。そして、そこから適当なJPEGファイルを開いてみて下さい。ブレークポインタで実行が止まったと思います(fig.02)。

ProjectBuilderのアイコン
[fig.02] ブレークポイントで止まったところ

ここで、右上に渡って来た引数が一覧で表示されていますので、それを見てみましょう。

aTypeは文字列ですので、要約に内容が表示されています。これを見ると、中身は「JPEG」という文字列です(fig.03)。

ProjectBuilderのアイコン
[fig.03] 変数の一覧に引数も表示されている

この「JPEG」というのは何の文字列なのでしょうか?ここで、前々回セットした「書類のタイプ」を開いて、もう一度見て下さい。この中で、「JPEG」と記述してある所は3ヶ所あります。「名前」と「拡張子」と「OSタイプ」です。実は、ここで渡って来るのは「名前」に書いた文字列なのです(fig.04)。

ProjectBuilderのアイコン
[fig.04] 書類のタイプの「名前」

つまり、ここで「拡張子」や「OSタイプ」で開けるファイルを指定していますが、その結果開いたファイルが何であったのかは、この「名前」で教えてもらえるというわけです。

前回、「書類のタイプ」を複数行設定した場合の例を示しましたが、覚えていますでしょうか(fig.05)。

ProjectBuilderのアイコン
[fig.05]書類のタイプを複数行設定した時の例

例えばこんな風に指定した場合は、PDFは違うクラスがインスタンス化されますが、JPEGとBMPは同じです。その場合でも、aTypeを見れば、どちらの書類のタイプと認識して開いたのか分かるというわけです。

この様に、ファイルの振り分け処理は、最初から実装されています。ですから、この部分は気にせずに、データの処理に専念出来るというわけです。もちろん、拡張子やOSタイプだけでは振り分けが行えない特殊な例もあると思いますが、その場合は自分で実装することも可能です。ですが、通常は必要無いでしょう。

それでは、今日はここまでですが、デバッガを起動したままですから、終了させましょう。まずはTinyViewの処理を再開させます。デバッグウィンドウの右上に並んでいるボタンの中から、「続ける」ボタンをクリックして下さい。TinyViewの処理が再開しますので、TinyViewのメニューから終了させて下さい。終了したら、デバッグウィンドウに戻って、左上を見て下さい。停止と書いてあるボタンがあるはずです。実は、デバッガはデバッグしているプログラムを終了しても止まらないのです。このボタンを押して、デバッガを終了させます。これを忘れますと、次に「ビルドとデバッグ」ボタンを押した時に、デバッガからプログラムが起動しなくて悩むことになります。これは良くやるミスですので、覚えておいて下さい。なお、ブレークポイントを外す方法ですが、ブレークポイントをドラッグ&ドロップで外に出せば外れます。

それでは、次はいよいよ読み込んだデータを表示すべく、実装して行きましょう。

前頁目次次頁