在isa指针旁边的实例对象中存储了什么类型的信息



objective-C中的所有类都继承自objc_class,其中superClasscache_tclass_data_bits包含所有方法、属性和协议。

实例对象将其superClass、方法、属性和原型信息存储在类对象中,类对象将其信息存储在metaClass的class_data_bits中。

那么,既然所有类信息都存储在实例对象的类对象中,那么除了isa指针之外,实例对象还存储什么呢?

对象的数据。

ObjC对象被布置为一个头,后面是实例变量(首先是根类,然后是每个子类,直到对象的直接实例变量)。您不会直接在objc_object中的任何位置看到此内容。但你会在_class_createInstancesFromZone:中看到它

size_t size = cls->instanceSize(extraBytes);
num_allocated = 
malloc_zone_batch_malloc((malloc_zone_t *)(zone ? zone : malloc_default_zone()), 
size, (void**)results, num_requested);

注意对cls->instanceSize(extraBytes)的调用。这是实例的完整大小,包括它的ivar(加上"额外")。它分配的不仅仅是一个isa指针。Ivar表具有对该额外分配的偏移。

";额外的";不经常使用,但它允许您为任何您喜欢的目的分配额外的内存。例如,NSString为其数据分配额外的内联存储,而不是创建额外的间接指针。(我想它仍然会这样做;它曾经这样做过,但我已经有一段时间没有检查代码了。)

相关内容

  • 没有找到相关文章

最新更新