objective-c - 在 isa 指针旁边的实例对象中存储了哪些信息?
问题描述
Objective-C 中的所有类都继承自,objc_class
它具有并包含所有方法、属性和协议。superClass
cache_t
class_data_bits
实例对象将其superClass
、方法、属性和原型信息存储在其类对象中,类对象将其信息存储在元类中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)
。这是实例的完整大小,包括其 ivars(加上“额外”)。它分配的不仅仅是一个 isa 指针。Ivar 表在该额外分配中具有偏移量。
“额外”并不经常使用,但它允许您为任何您喜欢的目的分配额外的内存。例如,NSString 为其数据分配额外的内联存储,而不是创建额外的指针间接寻址。(我认为它仍然会这样做;它曾经这样做过,但我有一段时间没有检查代码了。)
推荐阅读
- hive - 如何在 Hive 中获取当前的 unix 纪元
- asp.net-mvc - 无法在 ASP.NET MVC 5 中显示图像
- android - WorkManager 两次启动 Worker
- amazon-web-services - 更新注册表映像并再次应用服务时,Terraform 不会更新 aws_ecs_service
- csv - 使用groovy在jenkins slave上写一个csv文件
- swift - iOS推送通知即将到来但代码未调用
- spring-boot - 添加 5th Rabbit Listener 导致 Quartz Job 卡在阻塞状态
- python - protobuf 和 python:protoc 可以生成 __init__.py 文件吗?
- swift - 使用计时器更新时间时如何使时间与 macOS 系统时钟同步?
- javascript - 折线图 highchart 中的背景列