2017-11-20 11 views
1

私は長い間質問を考えています。誰かが私を助けることができれば、私はとても幸せになるでしょう。 すべてのインスタンスオブジェクトは、isaポインタを持つ構造体です。なぜ2つの異なるインスタンスのisaポインタが同じですか?

foo1->isa--0x10ed00df0 
foo2->isa--0x10ed00df0 
:その後、

Foo *foo1 = [[Foo alloc] init]; 
    foo1.name = @"foo1"; 

    Foo *foo2 = [[Foo alloc] init]; 
    foo2.name = @"foo2"; 

    NSLog(@"foo1->isa--%p", [foo1 class]); 
    NSLog(@"foo2->isa--%p", [foo2 class]); 

結果

@interface Foo : NSObject 
@property(nonatomic, strong) NSString *name;  
@end 

:事実はcontrary.For例にあるisa.But

typedef struct objc_object { 
    Class isa; 
} *id; 

ので、異なるインスタンスは異なる必要があります

2つのisaは同じです!なぜ彼らは同じですか?しかし、foo1はfoo2とは異なります! foo1.nameとfoo2.nameはどこに格納されていますか?キーだテーブルに格納されfoo1のとfoo2はの性質は「foo1の」または「foo2は」と値がプロパティリストされているではあり

+0

これらは同じクラスのものです。 'foo1'は' 'Foo'であり、' foo2'もそうです。 '0x10ed00df0'は' Foo'クラスを指します。 – TylerTheCompiler

+0

私はそれを知っているので、foo1とfoo2のすべてのプロパティは同じisaに格納されていますか? – Park

+2

@Park 'isa'ポインタはオブジェクトがどのクラスであるかを示すオブジェクト構造体の先頭のポインタです。クラスの特定のメンバはメモリ内の 'isa'ポインタの後に来ます。実際、' id'は構造体のフルサイズを取得しません。それは単にオブジェクトの先頭を指しています(Cの配列への配列の崩壊と同様に、Cの配列ポインタはメモリ内の配列の先頭を指しています)。 –

答えて

1

isaポインタが(読み:です)?ポイント型情報へそのオブジェクトのではなく、の状態(すべてのivarsの値の別名のセット)ではありません。したがって、同じクラスの2つのオブジェクト(クラスオブジェクトを含む)の場合、isaは同じ型情報(クラス)を指します。このタイプ情報は、タイプの一般的な記述です(どのメソッドが含まれていますか、どのivarsが存在するか)。実際の値(別名状態)ではありません。

状態がある - より複雑な何か簡素化する - 保存されたISA「の後ろに」:

instance i in memory 
i+00 isa pointer   // points to the type, equal for all instances of a class 
i+04 value of the 1st ivar // different for every instance 
i+08 value of the 2nd ivar // " 
… 

インスタンスのメモリをシステムから取得されたときに、それは単にobjc_objectためのメモリではありません構造だけでなく、イーバールのためにも。

あなたはこのような何かを想像することができます

struct objc_object struct myClass_instance 
{     { 
    Class isa;   Class isa; 
         id my1stIVar; 
         id my2ndIVar; 
         … 
}     } 

をいくつかの年のため、実際のメモリレイアウトが異なっていることに、注意してください。ただし、この例はQに答えるのに十分です。

+0

ありがとうございます!わかった!答えのために多くの記事やドキュメントを検索しますが、ほとんどの人はクラス、メタクラス、メソッドリスト、ivarListなどについて話します。あなただけが私が欲しいものは答えて、それは非常に明確です!実際のイナールはアイザの後ろにあります。そして、強力な証拠は、メソッド "ivar_getOffset(ivar)"が8を返し、isaポインタのサイズがちょうど8であるということです!私はとても幸せです! – Park

+0

ようこそ。私の答えをアップアップしたり、チェックしたりしてください。 –

関連する問題