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

公园

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

typedef struct objc_object {
    Class isa;
} *id;

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

@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 的属性是否存储在一个表中,键是“foo1”或“foo2”,值是属性列表?

阿明·内格姆-阿瓦德

isa指针(读:)指向类型信息该对象的,而不是它的状态(又名设置所有实例变量的值的)。因此对于同一个类的两个对象(包括类对象),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;
                       …
}                    }

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么目标C对象的isa字段的类指针有1个偏移量?

为什么在两个不同的指针上的malloc调用相同的地址空间?

为什么两个不同函数的数组参数和指针参数的地址相同?

为什么这两个应该相同的指针指向不同的数据?

为什么将定制应用于两个不同的属性时会返回相同的实例?

为什么这两个指针访问相同的元素?

为什么两个看似相同的变量会产生两个不同的结果?

具有相同指令集架构 (ISA) 的 2 个 CPU 之间的类比

什么是 C 中的“IsA()”函数?

什么是PCI-ISA卡?

为什么共享内存在两个块之间的指针位置相同?

R:为什么对于相同的点,来自两个不同软件的这两个不同的结果(拟合曲线)?

为什么我两个必须执行相同结果的不同sql查询的行为不同?

为什么相同的代码在不同的计算机上产生两个不同的fp结果?

为什么在两个不同的Chrome版本中,相同的行高呈现的颜色不同?

为什么我在运行两个Odoo实例(域相同但端口不同)时出现“内部服务器错误”?

“ isa”指针是否包含有关Objective-C中实例化的其他消息?

为什么在Linux中“哪个”找到相同符号链接的两个实例?

堆栈分配的类类型。为什么两个 ID 实例的地址相同?

为什么同一个类的两个实例获得相同的实例变量更改?

两个不同的Class实例给出相同的hashCode

为什么当GSON连载两个看似相同的包含HashMap有不同的行为?

为什么对两个相同的矩阵行进行幂运算会产生不同的值?

为什么此代码返回执行相同操作的两个不同值?

为什么两个相同的列表具有不同的内存占用量?

为什么相同的正则表达式会给出两个不同的结果?

为什么这两个相同的表根据浏览器的宽度而表现不同?

为什么DI为两个不同的范围返回相同的DbContext?

为什么两个具有相同文本和编码但大小不同的文件?