SimpleBoxes

Objective-C で使っているマクロと Objective-C++ を Xcode で利用するときの副作用

ARRAY マクロ

小さな行列オブジェクトをよく利用するとき、

#define ARRAY(first, ...) [NSArray arrayWithObjects: first, ##__VA_ARGS__ , nil]

のようなマクロを定義しておくと便利かも。

NSArray* array = ARRAY(@"Value1",@"Value2");

のように使います。最後の要素後「nil」はいりません。

問題点は途中に改行を含めることができないこと。一行で全ての要素を定義する必要があります。

マクロといえば、

#define ApplicationName \
[[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"]

#define DocumentDirectory \
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]

#define SupportDirectory \
[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject]

#define currentOrientation \
[UIApplication sharedApplication].statusBarOrientation

あたりは定義しておくと便利かも。Objective-C はクラス名やメソッド名が長いのが多い……。

Objective-C++ を Xcode で利用したとき

Objective-C で C++ と併用する場合、Objective-C++ を使います。一般的な拡張子は .mm 。

Xcode 3.* で Objective-C++ を利用する場合 (Xcode 4.* では未確認)、ちょっとした副作用があります。

Xcode にはリファクタリング機能があります。クラス名を変更したい時やメンバー変数を変更したい時に該当箇所をほぼ自動で検索・置換してくれる機能です。クラス名を変更したときは必要に応じてファイル名も変更してくれたり……。

なかなか便利な機能ですが、これが Objective-C++ だと動作してくれません。

そんな時は一時的に Objective-C++ のファイルを Objective-C として認識させるのが有効です。

Xcode のプロジェクトに追加されたファイルは、ファイルの拡張子とは独立した形で、ファイルタイプが保持されています。

ファイルを選択して、コンテクストメニューを開いて、General タブにその設定 (File Type) があります。

私は Xcode は英語で利用するようにしているため、日本語版での名称が分かりません。General タブは「一般」タブで、File Type は「ファイルタイプ」でしょうか。

これが

sourcecode.cpp.objcpp

のようになっていると、そのファイルは Objective-C++ の実装ファイルとして設定されていることになります。

これを

sourcecode.c.objc

のように変更すると、Objective-C として認識されるようになります。

ビルド前に戻すことを忘れないようにしてください。そうしないと、Objective-C++ のファイルが Objective-C としてコンパイルされてしまうので、エラーになってしまう場合があります。

スポンサーリンク

<< Re: 初めてiPhoneアプリを作る人が使いたがる機能 :: iPhone/iPad アプリケーション FloatyMemo をリリースしました >>