在 isa 指针旁边的实例对象中存储了什么样的信息?
What kind of information is stored in an instance object beside an isa pointer?
objective-C中的所有classes继承自objc_class
,其中superClass
、cache_t
和class_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 为其数据分配额外的内联存储,而不是创建额外的指针间接。 (我假设它仍然这样做;它曾经这样做,但我有一段时间没有检查代码了。)
objective-C中的所有classes继承自objc_class
,其中superClass
、cache_t
和class_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 为其数据分配额外的内联存储,而不是创建额外的指针间接。 (我假设它仍然这样做;它曾经这样做,但我有一段时间没有检查代码了。)