Objective-Cフレーズブック 第6章 〜 ここで一旦中止 〜
Objective‐Cフレーズブック―使いこなすためのコード&イディオム100+
- 作者: デイビッドチズナール,David Chisnall,パセイジ
- 出版社/メーカー: ピアソン桐原
- 発売日: 2012/12
- メディア: 単行本
- この商品を含むブログ (1件) を見る
前回の続き
第6章 文字列の操作
- ObjCにはNULL終端のC文字列と、文字列オブジェクトの2種類がある。ObjC文字列には、UTF-16文字のシーケンスとしてアクセスするが、内部表現は非公開。なお、UTF-16は可変長のエンコーディングであることに注意する
定数文字列の作成
const char* cstr = "C string";
NSString* objcstr = @"Objective-C string";
CFStringRef cfstr = CFSTR("Core Foundation string");
- CoreFoundationの文字列もある。 NSStringとCFStringは_bridgeキャストで相互変換が可能
文字列の比較
- ObjCの文字列同士が等しいかどうかを調べるには、-isEqualToString:を使用する
- isEqual:メッセージを送信する事で、ObjCのオブジェクトを比較できるが、等しいかどうかを決めるのはレシーバー次第
- 等式は可換である必要([a isEqual: b] == [b isEqual a])があるため、文字列とNSNumberインスタンス等の比較には注意すること
- 文字の値のみに基づいた単純な比較の場合、-compare:メソッドを使う
文字列を1文字ずつ処理する
- NSStringクラスは抽象クラス(クラスクラスター)。NSStringのサブクラスは、必ず -lengthと-characterAtIndex:を実装する必要がある。これらのプリミティブメソッドがあれば、単純なループで全ての文字にアクセスが可能だが、効率は著しく悪い
- -UTF8Stringを送信して返されたC文字列を処理する方が効率は良いが、可変長であることと、巨大な文字列で配列に格納できない可能性があることを念頭においておくこと
- 最も効率よく文字列中の文字にアクセスするには、-getCharacters:range:を使う
文字列エンコーディングの変換
- 全てのマルチバイトエンコーディングのデフォルトはビッグエンディアン
- 他のエンコーディングのC文字列からObjC文字列オブジェクトを作成するには、+stringWithCString:encoding:を使用する
- 文字列データを特定のエンコーディングのままで格納する場合、NSDataを利用すると便利
文字列の切り取り
- 文字列中のある範囲の文字が格納された新しいオブジェクトを作成するなら、-substingWithRange:が便利。元の文字列の中のデータを参照する文字列オブジェクトを返すだけで、文字列のコピーは発生しない。ただし、Mutableな文字列に大して呼び出した場合は、文字をコピーする必要がある
- NSCharacterSetは、文字のセットをカプセル化するもので、特定の文字セットの定義も多数存在する。-characterIsMember:メッセージで、単一の文字がメンバーかどうかをテストできる
文字列の分割
- 一つ目は-substringWithRange:。色々なケースで機能するが、労力が大きい
- 二つ目は-componentsSeparatedByCharactersInSet:で、特定の文字セットで分割可能
- 3つ目は+characterSetWithCharactersInString:を使用して文字セットを構築することで、このメソッドにstrtok_r()の様な動作をさせられる
文字列のコピー
- C++等で手動でメモリを管理している環境では、オブジェクトを防衛的にコピーする傾向にあるが、ObjCでは一般的ではない。逆に、コピーを保持すべき時にMutableなオブジェクトを保持する問題で苦しむ
- NSMutableStringに-retainを送信すると参照カウントがインクリメントされ、-copyを送ると新しいオブジェクトが得られる
- NSStringに-copyを送ると、常に不変の文字列が返される。可変の文字列が必要な場合には-mutableCopyingを送る
テンプレートからの文字列の作成
- 全てのオブジェクトは、NSStringを返す -descriptionに応答する必要がある
- printf()の書式指定で文字列を作成するには、NSStringの+stringWithFormat:を使う
文字列中のパターンの照合
- ObjCで正規表現を使うには、NSRegularExpressionを使う。これは、Unicode用コンポーネント正規表現コードのラッパー
- 正規表現オブジェクトはスレッドセーフなので、よく使われるパターンをグローバル変数に格納し、複数のスレッドで再利用するとよい
リッチテキストの格納
- NSAttributedStringクラスを使うと、文字列に任意の属性を割り当てることができる
うーん、再びつまらなくなってきた。Tips集に書いてあるようなことがくどい言い回しでぐだぐだと説明してあるだけで、それなら逆引きのTips集でダイレクトに処理の仕方を調べた方がうんと時間を有効に使えそう。
というわけで、時間を無駄にしているような感じなので、この本を読むのは一旦中断して別の事をやることにします。