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

时间:2017-11-20 05:31:22

标签: objective-c runtime

我想了很长时间的问题。如果有人可以帮助我,我会很开心。 我们知道每个实例对象都是一个带有isa指针的结构。

typedef struct objc_object {
    Class isa;
} *id;

所以不同的实例应该有不同的isa.But事实恰恰相反。例如:

@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的属性是否存储在一个表格中,该键是&#​​34; foo1"或" foo2"和值是属性列表?

1 个答案:

答案 0 :(得分:1)

isa指针(读取:)指向该对象的类型信息,而不指向状态 (又名所有ivars的值集)。因此,对于同一类的两个对象(包括类对象),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结构的内存,也适用于ivars。

你可以想象这样的事情:

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

请注意,多年来真正的内存布局是不同的。但是,这个例子足以回答你的问题。