【发布时间】:2018-05-03 07:01:42
【问题描述】:
我想了很久。如果有人可以帮助我,我会很高兴。 我们知道每个实例对象都是一个结构体,它有一个 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”,值为属性列表?
【问题讨论】:
-
因为它们属于同一类。
foo1“是”Foo,foo2也是。0x10ed00df0指向Foo类。 -
我知道,所以 foo1 和 foo2 的所有属性都存储在同一个 isa 中?
-
@Park
isa指针是一个位于对象结构开头的指针,它告诉您该对象是什么类。类的特定成员在内存中的isa指针之后 ——事实上,id并没有捕获结构的完整大小;它只是指向一个对象的开头(类似于数组如何衰减为 C 中的指针:C 中的数组指针只是指向内存中数组的开头)。 -
具有相同类的两个事物具有相同的
isa指针,因为class对象是相同的。您要比较的不是foo1->isa和foo2->isa,而是foo1和foo2,它们是指向对象本身的指针。这些指针是不同的。 -
@ItaiFerber 非常感谢!你帮我 ! ivars 在 isa 指针之后,因为指针是 8 个字节,所以第一个 ivar 从 8 个字节开始。
标签: objective-c runtime