上一篇文章探究了对象的创建已经底层结构,这篇详细介绍isa、对象以及互相的关系。

isa是什么

从源码分析,isa是个共用体,封装了类的信息。

  • nonpointer:是否对isa指针开启指针优化,0为纯isa指针,1:不止对象地址,还包含了类信息、对象引用计数等
  • has_assoc:关联对象标志位
  • has_cxx_dtor: 是否有c++析构函数xin
  • shiftcls:存储类指针的值
  • magic:用于调试器判断当前对象是否是真的对象还是没有初始化的空间
  • weakly_referenced:是否指向或曾经指向弱引用
  • unused: 未使用的
  • has_sidetable_rc: 引用计数表
  • extra_rc:引用计数大于10的时候

isa与类的关系

我们打印了实例对象和类对象的地址,然后通过控制台调试,验证了官网的图。0x0000000ffffffff8ULL为掩码,x/4gx 打印对象,是根据内存偏移,第一个是isa,会在下面的类结构中介绍。

对象的结构

万物皆对象。对象的本质是一个结构体,继承自objc_object(内部包含了isa),包含了superclass、cache、bits,其中cache_t,我们将在下一篇文章单独介绍。

bits内包含了class_rw_t和class_ro_t

class_rw_t结构为,内部包含了方法、属性、协议

method_array_t是一个二维数组

元素为method_t,包含了sel 、types和imp(sel相当于一本书的目录,imp目录所指的页码也就是具体实现)

同理property_array_t也是一样,内部是一个二维数组,含有property_t

protocol_array_t内部含有protocol_t

class_ro_t内部包含i属性、成员变量、协议。

实例对象、类对象、元类对象分别含有什么

这里就直接给出结论了,如果要验证的话,可以通过runtime去验证,大致思路为getIvarList获取成员变量,获取method,判断是否有地址(存在则有)。

  • 实例对象内含有成员变量的具体值
  • 对象方法、属性、成员变量、协议信息,存放在类对象中
  • 类方法,存放在元类对象中

拓展

rw和ro一道面试题,问这样添加会不会有问题。

 Class FFCar = objc_allocateClassPair([NSObject class], "FFCar", 0);//    class_addIvar(FFCar, "brand", sizeof(NSString *), log2(sizeof(NSString *)), "@");objc_registerClassPair(FFCar);class_addIvar(FFCar, "brand", sizeof(NSString *), log2(sizeof(NSString *)), "@");id car = [FFCar alloc];[car setValue:@"bgm" forKey:@"brand"];FFLog(@"%@",[car valueForKey:@"brand"]);

答案是会崩溃,ivar存在ivars中,存在ro中,所以要在注册类之前就要添加进去。从源码就能看出来,RW_CONSTRUCTING属性是注册类的时候已经确定下来了。

void objc_registerClassPair(Class cls)
{// Clear "under construction" bit, set "done constructing" bitcls->ISA()->changeInfo(RW_CONSTRUCTED, RW_CONSTRUCTING | RW_REALIZING);cls->changeInfo(RW_CONSTRUCTED, RW_CONSTRUCTING | RW_REALIZING);}
BOOL
class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *type)
{// Can only add ivars to in-construction classes.if (!(cls->data()->flags & RW_CONSTRUCTING)) {return NO;}
}

iOS进阶之底层原理-isa与对象相关推荐

  1. iOS 进阶之底层原理一OC对象原理alloc做了什么

    人狠话不多,直接上干货.这是第一篇,之后还会持续更新,当作自己学习的笔记,也同时分享给大家,希望帮助更多人. 首先,我们来思考,下面这段代码的输出是否相同.答案很明显,p1.p2.p3是指向相同的对象 ...

  2. iOS进阶之底层原理-block本质、block的签名、__block、如何避免循环引用

    面试的时候,经常会问到block,学完本篇文章,搞通底层block的实现,那么都不是问题了. block的源码是在libclosure中. 我们带着问题来解析源码: blcok的本质是什么 block ...

  3. iOS进阶之底层原理-weak实现原理

    基本上每一个面试都会问weak的实现原理,还有循环引用时候用到weak,今天我们就来研究下weak的实现原理到底是什么. weak入口 我们在这里打个断点,然后进入汇编调试. 这里就很明显看到了入口, ...

  4. iOS进阶之底层原理-消息机制

    消息发送的本质是objc_msgSend,至于为啥是这个,可以通过断点调试,这样就直接进入汇编,因为是汇编代码,熟悉常用指令即可,大部分根据注释走下去 objc_msgSend源码分析流程 这是一段汇 ...

  5. iOS进阶之底层原理-线程与进程、gcd

    线程与进程 线程的定义 线程是进程的基本单位,一个进程的所有任务都在线程中执行 进程要想执行任务,必须的有线程,进程至少要有一条线程 程序启动默认会开启一条线程,也就是我们的主线程 进程的定义 进程是 ...

  6. iOS进阶之底层原理-应用程序加载(dyld加载流程、类与分类的加载)

    iOS应用程序的入口是main函数,那么main函数之前系统做了什么呢? 我们定义一个类方法load,打断点,查看栈进程,我们发现dyld做了很多事,接下来就来探究到底dyld做了什么. 什么是dyl ...

  7. iOS进阶之底层原理-cache_t

    接着上一篇的对象结构探索,我们详细介绍cache_t.源码为最新的objc4-818.2. cache_t的底层结构 struct cache_t { // 省略一堆私有属性,方法 public:// ...

  8. iOS进阶之底层原理-锁、synchronized

    锁主要分为两种,自旋锁和互斥锁. 自旋锁 线程反复检查锁变量是否可用,处于忙等状态.一旦获取了自旋锁,线程会一直保持该锁,直至释放,会阻塞线程,但是避免了线程上下文的调度开销,适合短时间的场合. 互斥 ...

  9. php对象底层结构,PHP 底层原理之类和对象

    对于PHPer来说,OOP是不可或缺的开发思维,但是你对php类和对象的底层实现又了解多少呢?本着知其然且知其所以然的思想,让我们一起来寻找答案~ 类的底层实现可看作是之前我们讲过的变量.函数等的知识 ...

最新文章

  1. table row设置cell的html,display:table、display:table-row和display:table-cell的用法_html/css_WEB-ITnose...
  2. Microbiome:微生物所刘双江组建立人肠道微生物资源库(hGMB)
  3. 你需要知道的加密算法
  4. python3 for计数_python怎么实现计数?
  5. c++ 三次多项式拟合_线性回归进阶版,多项式线性回归讲解与实现(附完整代码)...
  6. 关系型数据库与NoSQL数据库简述
  7. 08年冬季足协代表VS三水喜健友谊赛
  8. SQL Server 2017 AlwaysOn AG 自动初始化(十二)
  9. VC 在对话框中增加菜单栏
  10. 每日一句20191104
  11. Python可视化编辑,让Python 不再难懂
  12. 个人网页制作 大学生个人网页设计 个人网站模板 简单静态HTML个人网页作品 HTML+CSS+JavaScript
  13. mysql用拼音显示字段名_MySQL汉字字段按拼音排序显示
  14. Prometheus监控报警系统入门
  15. 2021年10月程序员薪资出炉,你在哪个层级?
  16. flutter 设置全屏背景图(导航栏)
  17. 支付户+存管户基本解释
  18. 新浪顶级架构师保驾护航,国内首本大型分布式架构笔记浴火新生
  19. 华为服务器gpu卡型号,GPU运算服务器推荐
  20. 让犯罪有迹可寻,区块链存证被最高人民法院认可

热门文章

  1. MySQL补充部分-SQL逻辑查询语句执行顺序
  2. 10.Facade-外观模式
  3. VirtualBox uuid冲突问题
  4. [转]Asp.net 将js文件打包进dll 方法
  5. 解决vue初始化数据时的闪烁问题
  6. https Java SSLException protocol_version的问题解决方法
  7. js解决iframe跨域问题
  8. Mysql CPU占用高的问题解决方法小结
  9. python: 关于解决‘\u‘开头的字符串转中文的方法
  10. 如何在JavaScript中实现堆栈和队列?