objective-C中的所有类都继承自objc_class
,其中superClass
、cache_t
和class_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为其数据分配额外的内联存储,而不是创建额外的间接指针。(我想它仍然会这样做;它曾经这样做过,但我已经有一段时间没有检查代码了。)