1
struct
{
int integer;
float real;
}
first_structure;

したがって、first_structure のメンバーを参照するには、次のように記述します。

first_structure.integer = 7

私が書く場合:

    struct two_numbers
    {
    int integer;
    float real;
    }
    first_structure;

次に、*two_numbers* タグを使用して、次のような 2 つ目の構造を作成できます。

struct two_numbers second_structure;

また、typedef を使用してシノニムを作成できることも理解しています。

しかし、以下のコードを理解できません( http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocObjectsClasses.htmlのページから):

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;

したがって、すべてのオブジェクトには、インスタンスであるクラスを示す isa 変数があります。

どのようにそれを伝えることができますか???? このコードの意味を教えてください。

ありがとうございました。

4

2 に答える 2

1

それは次へのショートカットです:

struct objc_object
{
    Class isa;
};
typedef struct objc_object * id

型は構造体へのidポインタです。objc_objectしたがって、id型を使用する場合は、ポインターであるため、 の->代わりに演算子を使用します。.

このClass型は構造体へのポインタでもあることに注意してください。それは不透明型と呼ばれます。

基本的には、ポインターしかないため、コンパイラーがサイズを計算できることを意味しますが、実装の詳細はわかりません。

この種のパターンは、構造体の実際の実装を隠すために使用されます。型はヘッダー ファイルで定義されますが、実装はソース ファイルでのみ定義されます。

たとえば、ヘッダー ファイルでは次のようになります。

typedef struct A_Struct * A;

それは有効であり、その構造が実際には知られていない場合でも、構造ポインターへの型を定義します。

次に、ソース ファイルで次のように記述します。

struct A
{
    int x;
    int y;
};

これが実際の実装です。ユーザーはA型付きオブジェクトを作成できますが、ソース ファイルでのみ認識されるため、メンバーにアクセスすることはできません。ユーザーはA型指定されたオブジェクトを渡しますが、それらは にキャストされるためstruct A、そのメンバーにアクセスできます。

いいえ:

void foo( A someObject )
{
    struct A * a;

    a    = ( struct A * )someObject;
    a->x = 42;
}
于 2011-05-18T02:34:29.667 に答える
0

オブジェクトがインスタンス化されると、ランタイムは isa ポインターをクラスの名前を反映するように設定するため、それがわかります。Objective-C の「セレクター」の使用方法と同様に、慣れていない場合は、基本的にセレクターはメソッドの名前です。舞台裏では単なる NSString ですが、そうである必要はありません (代替実装 Cocotron は整数型の列挙型を使用していると思います)。

基本的に、ランタイムはどのオブジェクトが作成されているかを認識できるため、isa ポインターを設定できます。オブジェクトが何であるかを「クラス」と比較すると、おそらく舞台裏のNSStringを比較しているだけなので、イントロスペクションは機能します。

これであなたの懸念が解消されることを願っています。そうでない場合は、明確にするお手伝いができます

于 2011-05-18T02:33:54.260 に答える