为什么两个不同的实例是相同的指针?

Why are two different instances's isa pointer same?

这个问题我想了很久。如果有人能帮助我,我会很高兴。 我们知道每个实例对象都是一个结构体,它有一个 isa 指针。

typedef struct objc_object {
    Class isa;
} *id;

所以不同的实例应该有不同的isa.But事实是contrary.For例子:

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

然后

    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]);

结果:

foo1->isa--0x10ed00df0
foo2->isa--0x10ed00df0

两个isa是一样的!他们为什么一样?但是 foo1 与 foo2 不同! foo1.name 和 foo2.name 存储在哪里? foo1 和 foo2 的属性是否存储在 table 中,其键为 "foo1" 或 "foo2",值为 属性 列表?

isa指针(阅读:是一个)指向那个对象的类型信息,而不是它的state(也就是所有 ivar 值的集合)。因此对于相同class的两个对象(包括class对象),isa指向相同的类型信息(class)。此类型信息是类型的一般描述(包括哪些方法,哪些 ivar 存在),但不是实际值(又名状态)。

状态是——为了简化更复杂的事情——存储"behind" 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结构的内存,也是ivars的内存。

你可以这样想象:

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

请注意,有些年实际内存布局是不同的。但是,这个示例足以回答您的问题。