MemberBlock

名前

MemberBlock — アクセスに対する既存のC配列をオブジェクトコレクションとしてラップする方法

説明

外部メンバ割り当ては配列によって割り当てや解放がされないため、割り当てられたメモリの同一領域を複数の配列が参照できます。これには、開始位置とカウントでそれぞれに定義されたオーバーラップしているメンバ範囲も含まれます。この柔軟性のため、別々に作成された外部コレクションによって、単一の連続した初期アロケーションの部分範囲を相互に見ることができます。

外部メンバ割り当てを使えば、配列自身はこのメモリを割り当てようとしたり、配列がドロップされたときにそれを解放しようとしたりすることはありません。配列のドロップは、外部割り当てへの参照を削除するのみです。

外部メンバ割り当てとともに、カウントが常に与えられなければなりません。これには、compoundメソッドのsetCount:引数を使います。外部割り当てが使用されている場合、カウントをリセットする唯一の方法はMemberBlockをリセットすることで、setCount:メッセージを単独で使おうとしてもエラーが発生します。外部メンバ割り当てが使用されているとき、外部プログラムは、MemberBlock値が有効に割り当てられたメモリに対するポインタとなっていること、そしてそのメモリが少なくともsetCount:に与えられたメンバスロット数を含んでいることが、常に必要となります。

たとえ作成時にMemberBlockの設定がなされていなくても、内部メモリ配列が配列オブジェクトに利用されているときは、MemberBlockへのgetメッセージは常にそれに対するポインタを返します。一方、MemberBlockが設定されていれば、返されるポインタは先に与えられたものと同じになります。どちらのケースでも、返されるポインタを使用すれば、ネイティブなC表現を使った任意の方法でメンバ値を扱うことができます。配列が作成された後は、MemberBlockポインタが外部的に確立されたのか、あるいは内部割り当てによるのか判断する方法はありません。しかし、ポインタが内部割り当てで確立された場合、外部プログラムでこのメモリを解放しようとしたり、再割り当てしてはいけません。

このオプションは、既存のC配列をオブジェクトコレクションとしてラップする手段となります。動的なリサイズはサポートされなくなりますが、MemberBlockに新しい設定を与えれば、配列がすでに存在する後でもラップされた現在のC配列を置き換えることができます。新しい設定を与えるには、作成時に何らかの設定をしておかなければなりません。

MemberBlockに採用されているプロトコル

なし

メソッド

フェーズ: Creating

フェーズ: Setting

フェーズ: Using