概略<NSStringクラスリファレンス

Last-modified: 2014-01-21 (火) 12:30:56

概略

NSStringクラスは、不変な文字列を取り扱うオブジェクトへのプログラム的なインターフェイスを宣言します。不変な文字列は生成されたときに定義されるテキスト文字列なので、その結果として変更ができません。NSString は、Unicode 文字が格納された配列、すなわちテキスト文字列、を表すものとして実装されています。

NSStringの可変クラスは、NSMutableStringです。

NSStringクラスには、lengthとcharacterAtIndex:、この2つのプリミティブメソッがあります。これらを用いて、インターフェイスにあるすべてのメソッドが実装されています。lengthメソッドは、文字列にあるUnicode文字の総数を返します。characterAtIndex:は、0から始まるインデックスを用いて文字列にある1文字を取り出します。

NSStringは、文字列を見つけたり、文字列を比較するメソッドを宣言しています。加えて、文字列から数値を読み出したり、さまざまな方法で文字列をつなげたり、文字列をほかの形へ(たとえばエンコードしたりケースを変えるなど)変換するメソッドを宣言します。

The Application Kitにおいてはまた、NSAttributedStringクラスで使われるパラグラフやルーラーの属性をカプセル化のに、NSParagraphStyleクラスおよびそのサブクラスのNSMutableParagraphStyleクラス使います。それに加えて、文字を描画するメソッドがThe Application KitにあるNSStringの拡張部分で宣言されています。

NSStringは、それに対応するCore FoundationのCFStringRefとで"toll-free bridged"となっています。toll-free bridgeについての詳細な情報は、"Toll-free bridged"を参照してください。

文字列オブジェクト

NSStringオブジェクトはフレームワークにある文字列を表します。文字列をオブジェクトとして表すことで、ほかのオブジェクトとをあつかうどこにおいても、文字列が使えるようになります。カプセル化の恩恵も受けられるので、文字列オブジェクトは、文字の配列として分かりやすく見えるにもかかわらず、効率的であるのが求められるどんなエンコーディングにもどんな保存形態にも使うことができます。NSStringとNSMutableString、これらクラスターで実装している2つの公開クラスは、それぞれ編集不可能、編集可能な文字列をあつかうプログラム上のインターフェイスを宣言しています。

ノート:不変な文字列は生成の際に定義されたテキスト文字列なので、結果として変更できません。不変な文字列は、Unicode文字の配列(つまりテキスト文字列)として実装されています。不変な文字列を生成して取り扱うには、NSStringクラスを使ってください。変更が可能な文字列を生成して取り扱うには、NSMutableStringクラスを使ってください。

NSStringかNSMutableStringを使って生成したオブジェクトは、文字列オブジェクトと呼びます(混乱が生じない場面では、単に文字列と)。Cで文字列というと、スタンダードなchar *型のことを指します。クラスクラスタの特性から、文字列オブジェクトはNSStringもしくはNSMutableStringクラス自体のインスタンスではなく、それらが提供するプライベートクラスの1つから作られたインスタンスです。文字列クラスはプライベートなものですが、そのインターフェイスはパブリックで、抽象スーパークラス、NSStringとNSMutableString、で宣言されています。文字列クラスはNSCopyingとNSMutableCopyプロトコルに準拠しているので、ある形式の文字列をほかの文字列へ容易に変換できます。

文字を理解する

文字列オブジェクトはUnicode文字の配列として自身を表しています(UnicodeはUnicode, Inc.の登録商標です)。何文字を文字列オブジェクトが含んでいるかをlengthメソッドで決定でき、特定の文字をcharacterAtIndex:メソッドで取り出せます。それら2つのプリミティブメソッドは、文字列オブジェクトへアクセスする基盤を提供します。

しかし、文字列を使うということは、そのほとんどが高度な作業で、文字列を1つのエンティティとして扱うことです。文字列を他のものと比較したり、文字列から部分文字列を探したり、文字列をつなげて新しい文字列を作ったり、そのほか色々なことをします。文字1文字1文字について文字列を操作しなければならないとしたら、Unicode文字のエンコーディング、とりわけ文字の並びについて定めた事柄、を理解しなくてはなりません。詳細は、The Unicode Standard, Version 4.0 (The Unicode Consortium, Boston: Addison&-Wesley, 2003, ISBN 0-321-18578-1)とthe Unicode Consortium web site: http://www.unicode.org/を参照してくださいString Programming Guideにある、“Characters and Grapheme Clusters”の項も参照してください。

UTF-16でエンコードされたデータを解釈する

UTF-16でエンコードされた文字列から(もしくはUTF-16と解釈されるバイトストリームから)NSStringオブジェクトを生成して、そのバイトオーダーが指定されていなかったら、NSStringはそのUTF-16文字はビックエンディアンのものだと仮定します。ただし、BOM (byte-order mark) がある、つまりのBOMがバイトオーダーを指定している場合は除きます。NSStringオブジェクトをUnicode文字の配列から生成すると、返される文字列は常にネイティブエンディアンです。というのは、文字列オブジェクトの内部で使っている配列は、常にネイティブエンディアンのバイトオーダーに従ってUnicode文字を格納するからです。

オブジェクトの受け渡し

オブジェクトの受け渡しについて、可変な文字列オブジェクトは参照渡しで、不変な文字列はコピー渡しです。

サブクラス化での注意

NSString(とNSMutableString)はサブクラス化できますが、文字列(これはサブクラスを継承してない)を保管する手段と2つのプリミティブメソッドを実装が必要です。抽象クラスのNSStringとNSMutableStringは、そのほとんどがプライベートなものでなっているクラスクラスターのパブリックインターフェイスです。文字列を生成して返される実際のクラスは、あたえられた環境に適したものです。このクラスターの実体サブクラスを作るのは、いくつかの要件を満たさなければなりません(“Methods to Override”の項で説明しています)。

NSStringをサブクラス化するのに十分な理由があるか確認してください。サブクラスのインスタンスは文字列を表し、ほかのものを表すべきではありません。ですから、サブクラスが持つべき唯一の属性は、バッファに含まれる個々の文字を操作して取り扱うために使う文字バッファの長さだけです。NSStringのサブクラスを作る妥当な理由には、独特な保存領域を提供したり(おそらく、よりよいパフォーマンスのために)、メモリ管理といったオブジェクトの通常とは異なるいくつかの挙動を実装するのが挙げられます。必須と言うほどではない属性やメタデータを加えたいなら、より良いほかの方法としてオブジェクトの合成を勧めます(“Alternatives to Subclassing”を参照して下さい)。NSStringを使った合成の例として、CocoaはNSAttributedStringクラスを提供しています。

オーバーライドしなくてはならないメソッド

すべてのNSStringのサブクラスは、プリミティブインスタンスメソッドのlengthとcharacterAtIndex:をオーバーライドしなくてはなりません。これらメソッドは文字列の文字を提供する隠蔽された保存領域を操作しなくてはなりません。この保存領域としては、静的な配列、動的に確保したバッファ、普通のNSStringオブジェクト、もしくはほかのデータタイプなり機構が使えます。部分的も全体的にも、元来とは異なった実装を提供したいとするNSStringメソッドのオーバーライドを選別しなくてはならないでしょう。たとえば、よりよいパフォーマンスのためには、getCharacters:range:をオーバーライドして、このメソッドがより早い実装となるのをお勧めします。

サブクラスが管理している保存領域に適したイニシャライザを実装したいとします。NSStringクラスは指定イニシャライザを持たないので、イニシャライザはスーパークラスのinitメソッドを呼び出すだけを必要とされます。NSStringクラスはNSCopying, NSMutableCopy, NSCodingプロトコルへ準拠しています。自作したサブクラスのインスタンスをcopyingやcodingから生成したいなら、それらプロトコルにあるメソッドをオーバライドします。

hashメソッドをオーバーライドすべきではありません。

サブクラス化しない方法

多くの場面において、NSStrinのサブクラスを作るとはちがうより良くて簡単な方法、またはサブクラスを作ろうとしているほかのどのようなクラスクラスターの抽象、公開クラスにおいてでの方法は、オブジェクトの合成です。とくに、文字列オブジェクトにとって必須ではないメタデータやそその他さまざまな属性をサブクラスへ加えようしている場面でとるべき方法です。オブジェクトの合成では、NSStringオブジェクトを自作のクラス(一般的にはNSObjectのサブクラス)のインスタンス変数として、加えてメタデータを保持しているいくつかのインスタンス変数もその自作クラスに持たせられます。あとは、組み込んだ文字列オブジェクトとメタデータへのアクセサメソッドを備えたサブクラスのインターフェイスを設計するだけです。

オブジェクトの合成では、NSStringオブジェクトを自作のクラス(一般的にはNSObjectのサブクラス)のインスタンス変数として、加えてメタデータを保持しているいくつかのインスタンス変数もその自作クラスに持たせられます。

文字列オブジェクトである必要がないサブクラスのメタデータや何かほかの属性を加えるのを意図しているのなら、とりわけ有用な場面です。

NSStringもしくはほかの抽象クラス、クラスクラスタの公開クラス、これのサブクラスを作るよりより良くて簡単な一般的方法は、オブジェクトの合成です。文字列オブジェクトである必要がないサブクラスのメタデータや何かほかの属性を加えるのを意図しているのなら、とりわけ有用な場面です。オブジェクトの合成では、NSStringオブジェクトを自作のクラス(一般的にはNSObjectのサブクラス)のインスタンス変数として、加えてメタデータを保持しているその他のインスタンス変数もその自作クラスに持つことができます。あとは、組み込んだ文字列オブジェクトとメタデータへのアクセサメソッドを備えたサブクラスのインターフェイスを設計するだけです。

加えようとしている挙動が既に存在するクラスのそれを補うものなら、NSStringへのカテゴリが書けます。しかし覚えていて欲しいのは、カテゴリは使用するNSStringのインスタンスすべては影響を与えてしましい、予期せぬ結果となるかもしれません。

Referred from

NSString Class Reference, Apple Developer Library

 

Copyright

Copyright © 2013 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2013-09-18

 

NSStringクラスメソッドへ戻る