isa 指针理解整理

Class 数据结构:

class 结构体(旧结构)
最新的  object--对象结构体

 getIsa( )  为获取 isa 指向的类,isa 指向的类是对象的真实类型。

objc_object 结构体包含一个 isa 指针,类型为 isa_t 联合体。 可表示多种形态,既可以当成是指针,也可以存储标志位。


注意:  isa 指针不总是指向实例对象所属的类,不能依靠它来确定类型,而是应该用 class 方法来确定实例对象的类。因为KVO的实现机理就是将被观察对象的 isa 指针指向一个中间类而不是真实的类,这是一种叫做isa-swizzling的技术。

1. Class是一个指向objc_class(类)结构体的指针,而id是一个指向objc_object(对象)结构体的指针。

2. 类结构体 (objc_class)继承自对象结构体(objc_object),所以类也是对象。isa指针,也是从object结构体继承来的isa。

class 类结构体-- 新的

isa 指向总结:

1. 对象 (objec_object )的isa指针, 指向他的类对象。

2. 类对象 (objec_class)的isa 指针, 指向他的元类。

注⚠️:类对象中存放着普通成员变量与对象方法 (“-”开头的方法),类对象 在编译期产生用于创建实例对象,是单例。

注⚠️:成员变量是存放在类对象中的,并且编译的那一刻就已经决定好了。而分类是在运行时才去加载的。 分类的结构中没有成员变量列表,因此分类中不可以添加成员变量。

3. 元类(metaclass):也是一个对象,所有的元类的 isa 指针都会指向一个根元类。元类中保存了创建类对象以及类方法所需的所有信息(+ 方法列表 )。

4. 根元类的isa指针又会指向他自己,形成一个闭环。根元类 super class父类指向NSObject类对象。

5. 每个类仅有一个类对象,而每个类对象仅有一个与之相关的元类。

6. super_class 指针指向 objc_class 类所继承的父类,如果当前类已经是最顶层的类(如NSProxy), 则 super_class 指针为 NULL。

isa指针&父类&元类之间的关系

对象方法的调用: 在运行时编译器会将代码转化为 objc_msgSend(obj, @selector (selector))

1. 首先通过obj(对象)的 isa 指针找到obj(对象)对应的class(类)

2. 在class(类)中先去cache 中通过SEL(方法的编号)查找对应method(方法)

3. 若cache中未找到,再去methodLists中查找

4. 若methodists中未找到,通过 super_class向上一级父类结构体中查找,直至根class(也就是NSObject),  找到后 将method(方法)加入到cache中,以方便下次查找 

5. 找到后通过method(方法)中的函数指针 IMP 跳转到对应的函数中去执行。

类方法的调用:

1.  通过自己的 isa 指针指向的 objc_class 中的 isa 指针找到元类

2. 从元类的 methodLists 中查找该类方法,找不到则会通过元类 的super_class指针找到父类的元类结构体,然后从methodLists中查找该方法,如果仍然找不到,则继续通过super_class向上一级父类结构体中查 找,直至根元类 

3. 找到后通过method(方法)中的函数指针 IMP 跳转到对应的函数中去执行。

objc_cache: 方法缓存列表

找到要执行的方法后,把方法 的 method_name 作为key ,method_imp作为value 给存起来。当再次收到这个消息的时候,可以直接在cache 里找到,避免去遍 objc_method_list。提高效率。

method_imp: 指向实现程序的内存地址的指针。

注意:

如果直到 根类还是无法找到对应的方法,说明该接收者对象响应该消息,那么就会触发消息转发机制,给开发者最后一次挽救程序crash的机会。如果消息转发都失败了就回执行doesNotRecognizeSelector:方法报unrecognized selector错。

iSA 日常使用 --- kvo的实现原理:

1. 系统动态的生成一个类对象,这个类是监听对象的类的子类

2. 在生成的子类中重写了被监听的属性的set方法,之后将监听对象的isa指针指向系统动态生成的这个类

3. 当监听对象调用set方法时,由于监听对象的isa指针指向的是刚刚动态生成的类,所以执行的set方法也是子类中重写的set方法。

参考:kvo原理传送门

实现类似于多继承:通过rutime 修改某个对象isa指针的指向,让对象调用一些原本不属于他的方法。(消息转发)isa--swizzing 


OC的函数,属于动态调用过程,在编译期并不能决定真正调用哪个函数,只有在真正运行时才会根据函数的名称找到对应的函数来调用。因此给一个对象发送消息,并不会立即执行。

Objective-C的优点是它是动态的。动态能力有三种:

动态类-运行时确定类的对象

动态绑定-运行时确定要调用的方法

动态加载--运行时为程序加载新的模块:添加分类,方法,属性等。


参考:

苹果开发中文网站 - OC-底层实现isa指针 - CocoaChina_让移动开发更简单

isa指针介绍 - 简书   👍👍👍 ,变成一个共用体(union)结构,用位域来存储更多的信息

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

推荐阅读更多精彩内容