|
|
Log In | Not a Member? |
Contact ADC |
| < 前ページ次ページ > |
ランタイムシステムを支援するために、コンパイラは各メソッドの戻り型と引数型を文字列にエンコードし、その文字列とメソッドセレクタを関連付けます。また、コンパイラが使用するエンコード方式は他のコンテキストでも便利に使用することができるため、@encode()コンパイラディレクティブを通じて一般に利用できるようになっています。型指定を渡すと、@encode()はその型をエンコードした文字列を返します。型は、intのような基本型、ポインタ、タグ付き構造体や共用体、クラス名など、実のところ、Cのsizeof()演算子の引数として使用できる任意の型を指定できます。
char *buf1 = @encode(int **); |
char *buf2 = @encode(struct key); |
char *buf3 = @encode(Rectangle); |
次の表に、型コードをリストします。これらの多くは、アーカイブや配布のためにオブジェクトのエンコードに使用するコードと重複することに注意してください。ただし、ここにリストしたコードの中には、コーダの記述に使用できないコードや、コーダの記述に使用することも考えられる@encode()によって生成されないコードもあります(アーカイブや配布用のオブジェクトのエンコードについては、FoundationフレームワークリファレンスのNSCoderクラス仕様を参照してください)。
コード | 意味 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| C++の |
|
|
| 文字列( |
| オブジェクト(静的に型定義されているもの、または |
| クラスオブジェクト( |
| メソッドセレクタ( |
[配列型] | 配列 |
{名前=型...} | 構造体 |
(名前=型...) | 共用体 |
| numビットのビットフィールド |
| 型へのポインタ |
| 不明な型(このコードは特に関数ポインタに使用される) |
配列の型コードは大括弧で囲まれます。配列内の要素数は、開始の大括弧の直後、配列型の前に指定されます。たとえば、floatのポインタ12個の配列は、次のようにエンコードされます。
[12^f] |
構造体は中括弧内、共用体は小括弧内に指定されます。まず、構造体タグがリストされ、その後に等号、構造体のフィールドに関するコードが順にリストされます。たとえば、次のような構造体があるとします。
typedef struct example { |
id anObject; |
char *aString; |
int anInt; |
} Example; |
これは、次のようにエンコードされます。
{example=@*i} |
@encode()に、定義済みの型名(Example)または構造体タグ(example)のどちらを渡しても、エンコードは同じ結果になります。構造体ポインタのエンコードは、構造体のフィールドに関して同じ情報量を運びます。
^{example=@*i} |
しかし、別のレベルの間接参照によって、内部の型指定がなくなります。
^^{example} |
オブジェクトは、構造体のように扱われます。たとえば、NSObjectクラス名を@encode()に渡すと、次のエンコードになります。
{NSObject=#} |
NSObjectクラスでは、1つだけClass型のインスタンス変数isaを宣言します。
@encode()ディレクティブはこれらを返しませんが、ランタイムシステムは、表 12-2にリストした追加エンコードを使用します。これらは、プロトコルでメソッドを宣言するために使用する型修飾子です。
| < 前ページ次ページ > |
Last updated: 2007-10-31
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |