コレクションの共通の特徴
コレクションオブジェクト (または単にコレクション) は、通常は同じ型の離散値のコンテナです。コレクションには、他の Core Foundation オブジェクト、カスタムデータ構造、および原始データ値を含めることができます。含まれた Core Foundation オブジェクトは、異なる型のものであってもよいです。厳密に言えば、Core Foundation のコレクションのデータ要素は、プロセッサとコンパイラによって異なるポインタのサイズよりも大きくならないため、"含む" は正確な用語ではありません (しかし概念的には便利です)。しかし、ポインタは多大な柔軟性をもたらすため、コレクションオブジェクトは、ポインタアドレス以上のスペースを取らない原始値 (整数など) と同様に、Core Foundation オブジェクトへの参照とデータの任意の部分へのポインタを許可します。
すべてのコレクションオブジェクトを使用すると、特定の外部プロパティを満たす含まれた値にアクセスできます。一般に "キー" と呼ばれるこのプロパティは、コレクションの型によって施行される構成スキームによって異なります。たとえば、配列のキーは、コレクション内の位置を指定する整数です。一方、"キー" という用語が従来の意味を持つ辞書は、任意の値が、含まれる値を検索するためのキーとして機能することを可能にします。コレクションから取り出された Core Foundation オブジェクトは、所有コレクションによって解放される可能性があるため、永続することは保証されていないので、保持したい場合は保持 (retain) またはコピーする必要があります。特定のコレクション型のキーの詳細については、コレクションの型 を参照してください。
動作は呼び出し関数によって決定される
ほとんどのコレクションオブジェクトには、そのコレクションの要素に対して実行される基本的な操作を定義する一連の呼び出し関数があります。これらの呼び出し関数は以下によって呼び出されます:
- コレクションに追加された要素を保持 (retain) する
- コレクションから削除された要素を解放する
- コレクション内のある要素を別の要素と比較する
- 含まれている要素に関するデバッグ情報を出力する
- セット、バッグ、辞書キーの場合は、ハッシュコードを計算する
Core Foundation オブジェクトを保持するコレクションには、デフォルトの呼び出し関数が用意されています。
呼び出し関数がコレクションオブジェクトのメモリ管理の意味に影響することに特に注意してください。コレクションを作成するときは、そのコレクションにアイテムを追加したり削除するときに使用する呼び出し関数を指定します。デフォルトの呼び出し関数は、CF 型を含むコレクションに適しています。コレクションに追加されたオブジェクトを保持 (retain) し、コレクションから削除されたオブジェクトを解放します。カスタムデータがある場合、またはデフォルトの呼び出し関数が目的に合っていない場合は、独自の呼び出し関数を定義できます。この件については、コレクションの作成とコピー を参照してください。
特に興味深い関数の 1 つは、applier 関数 です。ほとんどのコレクションオブジェクトでは、呼び出し関数を定義できます。次に、このアプライヤー関数へのポインターを、その名前に ApplyFunction が埋め込まれた、コレクション関数に渡して下さい。呼び出し関数で定義された動作は、コレクション内の各要素に繰り返し適用されます。この振る舞いは、基本的に、コレクションを列挙する for ループと同じです。ループ内のコードはコレクション内の各要素に適用されます。
大部分のコレクションが変更不可能な変種を提供
ツリー (他のオブジェクトの真のコンテナではない) を除いて、コレクションには 2 つの "フレーバー" または変種があります。すなわち、不変と変更可能です。不変のコレクション内の値は、コレクションの寿命中に設定されます。それに値を追加したり、値を削除することはできません。ただし、変更可能なコレクションでは、値の追加、値の並べ替え、および値の削除ができます。変更可能なコレクションには、これらのオブジェクトを作成する関数の capacity パラメータによって決まる、固定サイズと可変サイズの 2 つのサブフレーバーがあります。固定サイズのコレクションでは、コレクションに含めることができる値の最大数を設定します。
一方、可変サイズのコレクションは、無制限の数の値を保持できます (または、使用可能なメモリーの量など、コレクションの外部の制約によってのみ制限されます)。固定サイズのコレクションはパフォーマンスが高い傾向がありますが、含めることができる値の数には明確な制限を設ける必要があります。
いくつかのコレクション関数は、変更可能なコレクションと不変なコレクションの両方で動作します (たとえば、データ要素の数を取得したりデータにアクセスしたり) 一方で、要素の追加、挿入、削除、並べ替えなどの操作は可変コレクションオブジェクトでのみ機能します。これらの操作の詳細については、変更可能なコレクションの操作 を参照してください。
前の章 次の章