2012年3月31日土曜日

C言語の手法


Objective-CはCのスーパーセットであるため、C言語をそのまま使用できます。
AppleのドキュメントではObjective-Cについては詳しく説明されていますが、Cについては前提事項のため、あまり言及がありません。私もあまり詳しくありませんが、なにかと便利ということをいくつか挙げてみます。

objc_runtime.h、TargetConditionals.hなどを見ると様々な事例を見ることができます。 開発時の応用できそうな個所をいくつかピックアップしてみます。

#define 識別子 置換文字列

ソース中の識別子を置換文字列に置き換える。
事例はtypedefを参照

#if ~ #elseif ~ #else ~ #endif

#if 定型式1
[定型式1がtrueのときにコンパイル対象となる記述]
#elseif 定型式2
  [定型式2がtrueのときにコンパイル対象となる記述]
#else
  [その他の場合にコンパイル対象となる記述]
#endif

事例はtypedefを参照

typedef

プラットフォームに応じてlongないしはint型のNSInteger、NSUIntegerを定義している個所です。

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif


NSStringをtypedefで別の型として宣言することもできます。
typedef NSString* SomeStringType;

typedefにより宣言した変数は、元の型の値を使用してもコンパイルエラーとはならず警告も出ないため厳密な型チェックは期待できませんが、これを引数や戻り値の型に使用するとコードが読みやすくなり、補完機能で候補を探すときに便利になります。


--------------------------------------------------------------

コンスタント文字列連結

NSString *str = @"ABC"
                 "DEF"
                 "GHI";

上の記述は次のように連結されます。

NSString *str = "ABCDEFGHI";

長い文字列を書くときなど適度に改行を加えると見やすくなります。

.stringsファイルの場合は上記の方法ではエラーになりますが、行末の改行をエスケープすることで同様のことが行えます。

"SomeWords" = "ABC\
CDE\
EFG";

この場合はエスケープされた改行も結合した文字列に含まるため、次の書き方と同等になります。
"SomeWords" = "ABC\nCDE\n EFG";

NSLogでのC Stringの表示

NSLog(@"%s", [NSData bytes]);

NSDataの中身が文字列(Cのchar*)と分かっている場合はNSStringにしなくてもNSLog表示が行えます。可読かどうかはエンコード次第です。

0 件のコメント: