タイトル今から始めるCocoaプログラミング》文書ファイルを扱うアプリケーションを作る(14)Cocoaでのファイル情報-1カテゴリーユーザインタフェース, Cocoa, 今から始めるCocoaプログラミング
作成日2002/1/8 15:53:49作成者新居雅行
CocoaのDocument-based Application、すなわち文書ファイルを含むアプリケーションを作る機能を使ったエディタ制作の続きである。正月後に保存したファイルにファイルタイプとクリエイタをつけるというテーマに実は取り組んでいたのである(ちょっとだけはまりながら…)。
Project Builderの「アプリケーション設定」での「書類のタイプ」では、ファイルタイプも記述できたし、ファイルのクリエイタも設定できた。しかしながら、Cocoaのフレームワークでの文書ファイル保存の処理には、ファイルタイプとクリエイタの設定は行われなかったのである。その部分は、プログラマが自分で作らないといけないのである。そのために、文書ファイルを管理するクラスのもとになっているNSDocumentクラスの特定のメソッドをオーバーライドしないといけないのであるが、それについては、次回に説明し、ここでは、Cocoa-Java特有のファイル処理について解説しておきたい。つまり、ファイル処理に必要なメソッドをまずはまとめておきたいのである。

Objective-Cでのプログラミングでは、Cocoaに用意されたクラスを使ってファイルの処理を行う。一方Javaの場合は、Javaの標準ライブラリであるjava.io.*あたりに定義されているFileやFileInputStreamあたりを使ってのファイル処理ができる。それに加えて、Cocoa-Java特有のファイル処理クラスがあったり、さらにはNSDataのようにファイル書き込み機能があるなど、いろいろなクラスにファイル関連処理機能がある。いずれにしても、java.io.*は基本として押さえておく必要があるが、これはJava Watch on the Xのコーナーでいずれとりあげるつもりである。さらに、Cocoa-JavaアプリケーションではCocoa特有のファイル処理を知っておく必要もでてくるので、そのつもりでドキュメントを見ておくべきだろう。
ここで、Java標準ライブラリでは、Fileクラスによってファイルを参照するが、Cocoaはパスの文字列を利用してファイルを特定する。パスはもちろんBSDでのパスであるので、Finderで見える階層のものではない。もちろん、FileクラスのgetPathメソッドでパスは得られるし。パスの文字列を引数にしたFileクラスのコンストラクタを呼び出すと、パスからFileクラスの生成もできるので相互利用は比較的容易である。Cocoa特有のファイル処理については以下の文書を参照してもらいたいがまだ文書は全部できていないようだ。Objective-CとJavaで用意されているクラスがまったく違うところに注意をしてもらいたい。Objective-CではNSFileManagerというクラスをよく使うのであるが、それに相当するJavaのクラスがないのである。

◇Cocoa Programming Topic: Low-level File Management
 http://devworld.apple.com/techpubs/macosx/Cocoa/TasksAndConcepts/ProgrammingTopics/LowLevelFileMgmt/index.html

Cocoa-Java特有のファイル処理機能はたくさんあるが、ここではファイルタイプとクリエイタに絞って機能を紹介しよう。
実は、最初はMRJにあるFileUtilsクラスのクラスメソッドであるsetFileTypeAndCreatorを使えばいいと思ったのであるが、なぜか、

2002-01-05 20:34:32.277 MOSAEditor[6251] *** _NSAutoreleaseNoPool(): Object 0x3658210 of class NSView autoreleased with no pool in place - just leaking

といったメモリのエラーがでてしまう。おそらくCocoa-Javaのクラスをインスタンス化したときには、オートリリースが設定されたメモリブロックとして確保するのだと思われるが、MRJの利用でそのオートリリースプールが壊されるのだと想像される。ただ、必ずダメというわけでもなく、あるとき作ったプログラムではCocoa-JavaなのにMRJのクラスを呼び出して利用できたりもしたことがある。ちょっと謎なのだが、いずれにしても、ファイルタイプやクリエイタをはじめ、ファイルの様々な情報を取り出すための機能がCocoa-Javaに用意されているので、それを利用するのが問題は少ないだろう。
(この項、続く)
関連リンク