Stringクラスの基本メソッド

文字列の格納

文字列インスタンスに、文字列を格納するには、PUT:メソッドを使います。例えば、
String  MyString
"  Put me into the string"  PUT:  MyString
とすれば、文字列「Put me into the string」がストリングインスタンスMyStringに格納されます。

細かくいえば、" Put me into the string"で、この内容の文字列が、名前なしで、辞書のデータ領域に格納され、実行時には、その格納場所の、先頭を示すメモリーアドレスと文字列長のバイト数がスタック上に返されます。PUT:メソッドは、格納すべき文字列がきっちり格納できる分のメモリー領域をヒープ(プログラムで自由に使えるメモリ)上に確保して、MyStringと結びつけ、その確保した領域に、文字列内容をコピーします。
スタック効果コメントは:
PUT:  ( addr len -- )
となります。
文字列は、論理的に連続した(プログラム上は一続きとして扱っていい)メモリー領域に格納されます。

なお、既に文字列が格納されているStringインスタンスにPUT:メッセージを直接送れば、内容を新しいものに取り替えてくれます。ことさらに前の内容を予め廃棄する必要はありません。

文字列を取り出す

格納された内容を取り出すには、GET:メソッドを使います。
GET:  MyString
とすれば、MyStringのために確保されたメモリー上の文字列格納領域の先頭アドレスとバイト長がスタックに返されます。:
GET:  ( -- addr len )

厳密にいうと、文字列にはアクティブな部分というのがあって、GET:はそのアクティブな部分だけのaddressとlengthを返します。格納後、何の操作も加えていなければ、全体のaddressとlengthが返るので、ここではそれを前提とします。

GET:メソッドの後には、文字列データに直接アクセスすることが多いと思います。このような場合、OS 9では、文字列データの場所がアクセス中に動かされたりしないように、予めLOCK:しておくべきです。
LOCK:  MyString	 \ まず、固定
GET:  MyString	 \ それから、Get

そして、データへのアクセスが一段落したら、直ちにUNLOCK:して、動かせるようにしておくべきです。
UNLOCK:  MyString

LOCK/UNLOCKが必要になるのは、StringオブジェクトがHandleの機構を用いて実装されているからです。この機構は、メモリー管理が即物的である状況で乏しいメモリーを効率的に利用する(邪魔なときは移動してスペースを開ける)には適した方法でしたが、現在では、そのメリットはほとんどありません。Carbon APIは伝統的なMacintoshと互換性を保つことを目指しているAPIであるため、Handleの機構が用いられているにすぎない、とさえいえます。OS X上では、Handleされたデータに直接アクセスする場合であっても、LOCK/UNLOCKを考える必要はないとされています。が、OS 9以前の場合はそうはいきません。ただ、メモリが潤沢になった現在、OS 9(あるいは8.6)上でもHandleの利点はほとんどなく、逆に、下手にロックしたままにすると害になる場合もあります。LOCK後はできる限り速やかにUNLOCKしておく方がよいようです。なお、Cocoa/Foundationではハンドルの機構は提供されておらず、iMopsでは、通常のヒープポインターを用いるので、Lock: Unlock:メソッドは意味がなく、定義されていません。


関連項目:






最終更新:2018年12月18日 11:00