代码之家  ›  专栏  ›  技术社区  ›  Park

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

  •  1
  • Park  · 技术社区  · 7 年前

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

    typedef struct objc_object {
        Class isa;
    } *id;
    

    @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在哪里。名称和foo2。是否存储名称?foo1和foo2的属性是否存储在一个表中,该表的键是“foo1”或“foo2”,并且值是属性列表

    1 回复  |  直到 7 年前
        1
  •  1
  •   Amin Negm-Awad    7 年前

    这个 isa 指针(读取: 是一个 )指向 类型信息 而不是它的 状态 (也称为所有IVaR的值集)。因此,对于同一类的两个对象(包括类对象), isa公司 指向相同的类型信息(类)。该类型信息是类型的一般描述(包括哪些方法,存在哪些IVAR),但不是实际值(也称为状态)。

    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;
                           …
    }                    }
    

    请注意,几年来,实际的内存布局是不同的。然而,这个例子足以回答你的问题。