iOS底层原理-OC对象的分类

OC对象可以分为3种:
 1.instance对象(实例对象)
 2.class对象(类对象)
 3.meta-class对象(元类对象)

instance对象

  • 定义:就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
  • 内存中存储的信息:
      1.isa指针
      2.其他成员变量

Tip.
实例对象的内存地址值与isa的地址是相同的

Class对象

  • 定义:一个类的类对象在内存中是唯一的,即每个类在内存中有且只有一个class对象
  • 内存中存储的信息:
      1.isa指针
      2.superclass指针
      3.类的属性信息(@property),类的对象方法信息(instance method)
      4.类的协议信息(protocol),类的成员变量信息(ivar)

Tip.
1.此处的类的成员变量信息指的是,成员变量的描述信息(类型,变量名等)
2.class的底层实现实际就是调用object_getClass方法

Meta-Class对象

  • 定义:每个类在内存中有且只有一个meta-class对象
  • 内存中存储的信息:
      1.isa指针
      2.superclass指针
      3.类的类方法信息

Tip.
1.获取原类对象方式:将类对象作为参数传入object_getClass方法中 ,即可获得原类对象
2.注:class方法返回的一直是class对象,类对象,故[[NSObject class]class]无论调用多少次class方法,都为类对象
3.meta-class对象和class对象的内存结构是一样的,但是用途不一样,即普通的class对象对应存储的信息(类的属性名等)为NULL,同理,对于类对象而言,类方法信息也为NULL
4.调用class_isMetaClass可以判断是否为原类对象

比较三个方法:
objc_getClass方法是传入一个字符串,返回对应的类对象,不会返回原类对象
object_getClass方法是传入一个对象,根据传入的对象,返回类对象或原类对象,即是拿到isa
class方法:返回的就是类对象

[person personTest];
//底层上,会将实例方法或对象方法转换成runtime的objc_msgSend方法,personTest,但具体是对象方法还是类方法是不知道的
//实际上即为objc_msgSend(person ,@selector(personTest));

实例对象调用对象方法,底层就是给实例对象发送一条消息
类对象调用类方法,底层就是给类对象发送一条消息

isa指针

  • instance的isa指向class,class的isa指针指向meta-class
  • 当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
  • 当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用

superclass指针

  • 指向父类的类对象,类对象的superclass指向其父类的类对象,原类对象的superclass指向其父类的原类对象
  • 若student继承自person,则student调用person中的对象方法,调用流程是:student的isa指针找到student的类对象,通过该类对象的superclass指针找到person的类对象,调用person的对象方法

isa、superclass总结

知识点汇总:
 1.instance的isa指向class
 2.class 的isa指向meta-class
 3.meta-class的isa指向基类的meta-class
 4.class的superclass指向父类的class,如果没有父类,superclass指针为nil
 5.meta-class的suerclass指向父类的meta-class,基类的meta-class的superclass指向基类的class
 6.instance调用对象方法的轨迹:isa找到class,方法不存在,就通过superclass找父类,直到superclass为nil为止
 7.class调用类方法的轨迹:isa找到meta-class,方法不存在,就通过superclass找父类,直到superclass为nil为止

最终调用的方法是不知道对象方法还是类方法的,而是通过方法名,因为oc没有很严格地面向对象,发送消息则是寻找isa,再一级一级往上寻找

Snip20180620_5.png

superclass内是直接存储父类的地址值,而isa中的指针需要&一个MASK值才能得到类对象的地址值

Snip20180622_11.png

若为.m文件,则只能认识oc及c语言,而改成mm文件,则都能识别

一些问题总结

Q1.对象的isa指针指向哪里?

  • instance对象的isa指向class对象
  • class对象的isa指向meta-class对象
  • meta-class对象的isa指向基类的meta-class对象

Q2.OC的类信息存放在哪里?

  • 对象方法、属性、成员变量、协议信息存放在class对象中
  • 类方法存放在meta-class对象中
  • 成员变量的具体值,存放在instance对象

类与元类对象在程序一开始时就会加载进内存中,当需要使用时,调用load方法使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 写在前面 一些知识也许我们都知道,但是可能脉络不是很清晰,接下来就捋一捋这些容易绕晕的知识点。 不晕的外圈 OC ...
    coderLZ阅读 1,530评论 0 3
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,678评论 0 9
  • 一、Objective-C对象的分类 Objective-C中的对象,简称OC对象,主要可以分为3种 instan...
    紫荆秋雪_文阅读 841评论 0 1
  • iOS底层原理总结 - 探寻OC对象的本质 对小码哥底层班视频学习的总结与记录。面试题部分,通过对面试题的分析探索...
    xx_cc阅读 21,153评论 31 177
  • 你孤单的伤心,杳无音讯 你知道其实我都知道
    黎元阅读 100评论 0 0