首页 > 解决方案 > 在 isa 指针旁边的实例对象中存储了哪些信息?

问题描述

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

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

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

标签: objective-c

解决方案


对象的数据。

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)。这是实例的完整大小,包括其 ivars(加上“额外”)。它分配的不仅仅是一个 isa 指针。Ivar 表在该额外分配中具有偏移量。

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


推荐阅读