ごぶさたしています。鶴薗さんが、Mac OS X 10.1でのCocoa開発関連の変更点をきれいにまとめていただきましたので、「Cocoaはやっぱり!出張版」だけをお送りします。以下のPDFは、鶴薗さんの元原稿です。じっくり読むにはこちらの方が楽かもしれません。
http://mdonline.jp/figs/01/0028/MDOnline%202001.10.pdf
私の方ですが、少しずつながら回復はしているものの、まだあまり食事も食べることができませんし、時折苦しくなるのは変わりません。ちゃんと検査をしたところ、特に重篤なところは見つからないということで、とりあえずは一安心ですが、それでも直りが悪いので、まだ細かくいろいろ検査をやっているところです。再開にはもう少しかかりますので、しばらくお待ち下さい。
それから、購読期間の更新をしていただいた方もいらっしゃいますが、すみませんが、更新作業は少し待って下さい。休刊期間の充当を、更新時の料金の割り引きで引き当てようということを考えていますので、更新の料金を向こう1年ほど少し安くするというふうにしようと思っています。今月になって更新をしていただいた方には別途対処させていただきます。
(新居雅行 msyk@mdonline.jp)
■ 今回のテーマ
Mac OS X 10.1がついに2001.9.29にリリースされました。既に手にされている方も多いかと思います。そこで今回は、Mac OS X 10.1のパッケージに添付の新しいDeveloper ToolsやFoundationやApplication Kitフレームワークの新機能について解説をしたいと思います。細かいところまで含めるとかなりの量になりますので、全部はフォローできませんが、重要だと思われる箇所や興味深い箇所についてピックアップして説明を行っていきます。詳細はリリースノートに記述されていますので、必要に応じて参照してください。
◇Appleサイト
http://developer.apple.com/techpubs/macosx/ReleaseNotes/index.html
◇ハードディスク上 ( Developer Toolsをインストールした場合 )
/Developer/Documentation/ReleaseNotes/
■ Project Builderの新機能
◎クラスブラウザー
Project Builderの見た目で一番変化が大きいのは、プロジェクトウィンドウの左側に追加されたクラスタブです。ここを開くとクラスブラウザ−が表示されます。
図. Project Builderのクラスブラウザーの操作手順
クラスタブをクリックすると、クラスブラウザーが表示されます…1。上部には、クラスツリーが表示され、階層構造を見ることが出来ます。一番下にあるポップアップメニューやオプションボタンで表示形式を変えることが出来ます。フレームワークのクラスだけにしたり、プロジェクトで定義しているクラスだけにしたりということが可能です。そして、クラス名をクリックすると下部には、そのクラスのメソッドが表示されます…2。さらに、メソッド名をクリックすることで、フレームワーク内のクラスならば、ヘッダーファイルの宣言の箇所が、自前のクラスの場合は、ソースファイルの実装箇所が表示されます…3,4。ダブルクリックすると、単独のウィンドウで開くことができます。
クラスブラウザーの中に小さい本の形をしたアイコンがありますが、これをクリックすると…1、リファレンスが表示されます…2。
図. クラスブラウザーからリファレンスを呼び出したところ
◎メソッド一覧メニュー
ソースを表示するウィンドウの上部に、メソッド等の一覧がメニューで表示されるようになりました。選択すると、定義してある場所へスクロールします。ヘッダーファイルでも同様に使用できます。
図. メソッド一覧メニューを表示したところ
#pragma markを使うと、メソッドの先頭だけではなく、ソース中の特定の場所にジャンプすることができるようになります。
#pragma mark LABELNAME
のように書いておくと…1、mark以降の文字がメニューに表示されるようになり、ジャンプできるようになります…2。
図. #pragma markを使ってメニューにSETTITLEを登録したところ
◎ソースコードからコマンド+ダブルクリックで検索
Cocoaのフレームワークのメソッド名は、かなり長いものが多くあります。それを記憶するのは大変なので、よくヘッダーからコピーをしてきますが、ヘッダーの該当個所まで行くのもちょっと大変です。新しいProject Builderでは、途中まで入力して、コマンドキーを押したままその文字列をダブルクリックしますと、その箇所を検索文字列として検索を行います。検索結果の数によって表示の仕方が変わりますが、数が少なめの場合は、メニューがポップアップして一覧が表示されます。これを選ぶことで定義箇所にジャンプできますので、そこからコピーをするとよいでしょう。
図. schedと入力して、その文字列をコマンド+ダブルクリックしたところ
◎Objective-C++対応
コンパイラはObjective-C++に対応しました。これで、Objective-CとC++を混ぜて書くことが出来るようになりました。C++の資産がある方は、ライブラリなどを流用できるようになります。
[鶴薗賢吾]
関連リンク:Cocoaはやっぱり!
カテゴリ:Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
■ Interface Builderの新機能
◎未接続の警告マーク
Interface Builderは、ドキュメントウィンドウ内にあるインスタンスで、アクションやアウトレットに未接続のものがあると警告マークが表示されるようになりました。ウィンドウの中に配置されているビューに未接続のものがある場合は、ウィンドウのインスタンスに警告マークが表示されます。この機能によって、接続忘れが減ることでしょう。
図. 未接続のアクションやアウトレットがあるときの警告マーク
◎クラスツリーのカラム表示
クラスタブには、従来のリスト表示に加えて、Finderと同様なカラム表示が追加されました。クラスの数が多いこともあり、リスト表示よりもスクロールの量が減るため、こちらの方が使いやすいのではないかと思います。
図. クラスツリーのカラム表示
◎クラスのサーチ機能
さらに、クラス表示画面の右上のSearchと書かれているところに文字列を入力すると、入力した文字列と前方一致するクラスへジャンプしてくれるようになりました。例えば、「 nso 」と入力すると「 NSObject 」が選択されるようになります。大文字/小文字の違いは無視されます。
図. クラスのサーチを行ったところ
◎インフォパネルでのクラス編集
クラスの編集は、インフォパネルで行うようになりました。今まではクラスツリーの中でクラスの中身を編集するということで、ややごちゃごちゃとした中での編集でした。別ウィンドウになりましたので、こちらの方がシンプルで使いやすいのではないかと思います。アクションやアウトレットを追加するには、「 + 」と書かれているボタンをクリックします。削除は、「 - 」ボタンで行います。
図. インフォパネルでのクラスの編集画面
◎ソース出力時のファイルマージ
Interface Builderには、作成したクラスのヘッダーとソースの雛形を出力する機能がありますが、クラスに変更が加わって、再度出力をするとき、今までは完全な上書きしか出来ませんでした。出力した雛形に対して手で編集を加えてしまっている場合は、上書きされると困るため面倒なことになっていました。新しいInterface Builderでは、出力時に以下のアラートが表示されて、上書きだけでなく、ファイルマージが選べるようになりました。
図. ファイル出力時の確認アラート
Mergeボタンをクリックすると、FileMergeアプリケーションが起動します。古いファイルとの相違点を表示してくれて、違っている箇所毎に、どちらのソースを新しいソースへ引用するかを指定できるようになっています。
[鶴薗賢吾]
関連リンク:Cocoaはやっぱり!
カテゴリ:Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
■ Application Kitの新機能
◎ドックによる通知
バックグラウンドで動いているアプリケーションから「 エラーが発生した 」や「 メールが着信した 」などのユーザーへの通知がある場合に、ドック内のアプリケーションアイコンをバウンドさせるという通知方法が新たに追加されました。以下のような感じになります。
図. ドックの通知でアプリケーションアイコンがバウンドしたところ
NSApplicationのrequestUserAttention : メソッドで、通知を行うことが出来ます。通知の種類には、一度だけジャンプするものと繰り返しジャンプするものの2種類があります。
★NSApplication : ドックによる通知を行う
[書式] - (int) requestUserAttention : (NSRequestUserAttentionType) reqType
[入力] reqType : 通知の種類
[出力] 返り値 : 通知の識別番号 ( キャンセルするときに使用する )
// NSRequestUserAttentionType: ドックによる通知の種類
enum {
NSInformationalRequest = 0, // 一度だけジャンプ
NSCriticalRequest = 1 // 繰り返しジャンプ
} NSRequestUserAttentionType;
int iReqNo = [ NSApp requestUserAttention : NSCriticalRequest ]; // 通知開始
: 何か処理をする
[ NSApp cancelUserAttentionRequest : iReqNo ]; // 通知中止
- (NSMenu *) applicationDockMenu : (NSApplication *) sender {
[ songMenuItem setTitle : @"Kero song Tambo mix" ];
return( dockMenuBase );
}
// NSTextViewに文字列をしゃべらせるサンプル
[ textView setString : @"My name is Kero." ];
[ textView startSpeaking : self ];
関連リンク:Cocoaはやっぱり!
カテゴリ:Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
■ Foundationの新機能
◎ファイルタイプとクリエータ
Mac OS X 10.0.4までの二大フレームワークでは、ファイル属性のファイルタイプとクリエータに関しては、サポートがあまりなされていませんでした。そのために、Carbon APIを呼ぶ必要がありました。10.1になってようやくNSFileManagerクラスでサポートが行われるようになりました。ファイルの属性を取得するメソッドを使うことで、ファイルタイプとクリエータの情報も同時に取得できます。
★NSFileManager : ファイル属性を取得する
[書式] - (NSDictionary *) fileAttributesAtPath : (NSString *) path
traverseLink : (BOOL ) yorn
[入力] path : 属性を取得したいファイルのパス
yorn : リンクを辿るなら - YES、辿らないなら - NO
[出力] 返り値 : ファイルの属性が格納された辞書
このように、返り値が辞書になっていますので、ファイルの属性が沢山詰まった辞書のインスタンスが返ってくることが分かります。以下のようにすると、指定のファイルパスのファイル属性が得られます。
// filePathに存在するファイル属性の辞書の表示
NSLog( @"%@", [ [ NSFileManager defaultManager ]
fileAttributesAtPath : @" filePath "
traverseLink : YES ] );
ファイル属性の辞書のサンプル
2001-XX-XX 16:31:55.374 FileTypeCreator[428] {
NSFileExtensionHidden = 0;
NSFileGroupOwnerAccountName = staff;
NSFileHFSCreatorCode = 943868237;
NSFileHFSTypeCode = 1246774599;
NSFileModificationDate = 2000-12-08 19:40:46 +0900;
NSFileOwnerAccountName = crane;
NSFilePosixPermissions = 511;
NSFileReferenceCount = 1;
NSFileSize = 4003;
NSFileSystemFileNumber = 282823;
NSFileSystemNumber = 234881033;
NSFileType = NSFileTypeRegular;
}
// ファイルパスからファイルタイプとクリエータをNSStringで取得
NSFileManager *fm = [ NSFileManager defaultManager ];
NSDictionary *dic = [ fm fileAttributesAtPath : filePath
traverseLink : YES ];
NSLog( @"%@", NSFileTypeForHFSTypeCode( [ dic fileHFSTypeCode ] ) );
NSLog( @"%@", NSFileTypeForHFSTypeCode( [ dic fileHFSCreatorCode ] ) );
// ファイル属性を変更するサンプル
// ファイル属性を取得
NSString *filePath = @"ファイルパス";
NSFileManager *fm = [ NSFileManager defaultManager ];
NSDictionary *dic = [ fm fileAttributesAtPath : filePath
traverseLink : YES ];
// ファイル属性をコピー
NSMutableDictionary *dicNew = [ NSMutableDictionary
dictionaryWithDictionary : dic ];
// OSTypeを準備
OSType fileType = NSHFSTypeCodeFromFileType( @"’ImgV’" );
OSType creator = NSHFSTypeCodeFromFileType( @"’JPEG’" );
// NSNumberを準備
NSNumber *numFileType = [ NSNumber numberWithUnsignedLong : fileType ];
NSNumber *numCreator = [ NSNumber numberWithUnsignedLong : creator ];
// ファイル属性辞書を変更
[ dicNew setObject : numFileType
forKey : NSFileHFSCreatorCode ];
[ dicNew setObject : numCreator
forKey : NSFileHFSTypeCode ];
// ファイル属性を変更
[ fm changeFileAttributes : dicNew
atPath : filePath ];
//ファイル移動のサンプル
NSFileManager *fm = [ NSFileManager defaultManager ];
BOOL bResult;
NSString *srcPath = @"移動元";
NSString *dstPath = @"移動先";
bResult = [ fm movePath : srcPath
toPath : dstPath
handler : nil ]; // 移動
関連リンク:Cocoaはやっぱり!
カテゴリ:Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
■ 拡張子の扱い
◎拡張子に関するガイドライン
Mac OS X 10.1で、ファイルの拡張子の扱いについてのガイドラインが定義されました。全てのファイルに拡張子を表示するかどうかのフラグが、ファイル属性として追加されています。画面にファイル名やファイルパスを表示する際には、このフラグを参照して表示する必要があります。多くのアプリケーションは、このための修正が必要になるでしょう。拡張子のガイドラインは以下のところにありますので、参照ください。
◇Appleサイト
http://developer.apple.com/techpubs/macosx/ReleaseNotes/FileExtensionGuidelines.html
◇ハードディスク上 ( Developer Toolsをインストールした場合 )
/Developer/Documentation/ReleaseNotes/FileExtensionGuidelines.html
このガイドラインに沿っていないと、ファイル名の表示がFinderと異なるという状況になり、ユーザーに混乱を与えかねませんし、Mac OS X 10.1対応と謳うためには、必須のガイドラインと言えます。
基本的に全てのファイルには拡張子を付けることになります。これは、他のプラットホームとのファイル交換のことを考えたためです。しかし、なるべくユーザーに拡張子の存在を意識させないようにするために、ユーザーがファイル名を入力した時に、拡張子を入力しなかった場合は、拡張子を隠すように属性をコントロールした上で、そのファイルのフォーマットに応じた拡張子を付けます。逆に、ユーザーが意識的に拡張子を入力した場合は、拡張子はそのまま表示します。どちらにしても拡張子は付くわけですが、入力したままが表示されるのというのが方針で、これをAppleは「 What you see is what you type 」と呼んでいます。
◎ファイル名の表示
What you see is what you typeを実現するためには、ファイル名を表示するときに拡張子フラグを参照しないといけませんが、簡単な仕組みが用意されています。displayNameAtPath : というメソッドがNSFileManagerに用意されていて、ファイルパスを与えると、表示用のファイル名を得ることが出来ます。
NSFileManager *fm = [ NSFileManager defaultManager ];
NSString *dispName = [ fm displayNameAtPath : @" filepath " ];
NSSavePanel *sp = [ NSSavePanel savePanel ];
int iSts;
BOOL bHidden;
[ sp setCanSelectHiddenExtension : YES ]; // チェックボックス表示
iSts = [ sp runModalForDirectory : NSHomeDirectory()
file : @"Pictures" ];
bHidden = [ sp isExtensionHidden ]; // チェックボックスの状態取得
// ファイル属性の辞書のサンプル
2001-XX-XX 16:31:55.374 FileTypeCreator[428] {
NSFileExtensionHidden = 0;
NSFileGroupOwnerAccountName = staff;
: 省略
// 拡張子を隠すかどうかの属性を変更する
// ファイル属性を取得
NSFileManager *fm = [ NSFileManager defaultManager ];
NSDictionary *dic = [ fm fileAttributesAtPath : filePath
traverseLink : YES ];
// ファイル属性をコピー
NSMutableDictionary *dicNew = [ NSMutableDictionary
dictionaryWithDictionary : dic ];
// NSNumberを準備
NSNumber *extHidden = [ NSNumber numberWithBool : YES or NO ];
// ファイル属性辞書を変更
[ dic setObject : extHidden
forKey : NSFileExtensionHidden ];
// ファイル属性を変更
[ fm changeFileAttributes : dicNew
atPath : filePath ];
//拡張子を隠すかどうかの属性を取得する
// ファイル属性を取得
NSFileManager *fm = [ NSFileManager defaultManager ];
NSDictionary *dic = [ fm fileAttributesAtPath : filePath
traverseLink : YES ];
// フラグを取得
BOOL bHidden = [ dic fileExtensionHidden ];
関連リンク:Cocoaはやっぱり!
カテゴリ:Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版