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

What kind of information is stored in an instance object beside an isa pointer?

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

实例对象将其superClass、方法、属性和协议信息存储在其class对象中,而class对象将其信息存储在元类的class_data_bits中。

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

object的数据。

ObjC object 布局为 header,后跟实例变量(首先是根 class,然后每个子 class 向下到 object的直接实例变量)。您不会直接在 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 table 已抵消该额外分配。

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