这个问题我想了很久。如果有人能帮助我,我会很高兴。我们知道每个实例对象都是一个结构体,它有一个 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] 删除。
我来说两句