【iOS】彻底搞懂isa和superclass的作用

实例对象,类对象,元类对象的isa指向

instance的isa指向class
class的isa指向meta-class
meta-clas的isa指向基类的meta-class

类对象,元类对象的superclass指向

class的superclass指向父类的class
如果没有superclass则指向nil
meta-class的superclass指向父类的meta-class

特殊: 基类的meta-class的superclass指向基类的class

isa和superclass的作用

实例对象的isa和superclass的作用

eg,比如有对象Worker,继承自Person,Person继承自NSObject.创建Worker实例对象,调用eat对象方法

    Worker *w = [[Worker alloc]init];
    [w eat];

//    eat方法
    - (void)eat{
        NSLog(@"person eat %@",self);
    }

假设Worker有eat方法,那么会

  1. 通过worker实例的isa找到worker的class
  2. 在class的方法列表里面找,因为worker有eat方法,所以找到了,调用

note: 即使父类有eat方法也只会调用worker自身的

worker eat

假设Worker没有eat方法,Person里面有

  1. 那么会通过worker的isa找到worker的class对象
  2. 在class对象的方法列表里面找,因为worker没有eat方法,找不到
  3. 通过worker的class对象的superclass找到Person的class对象
  4. 在Person的class对象的方法列表里面找,因Person有,找到了,调用

面试复习笔记:

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的iOS开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
——点击加入:iOS开发交流群就可以免费领取

person eat

假设worker没有,person也没有,NSObject的分类里面有

  1. 那么会通过worker的isa找到worker的class对象
  2. 在class对象的方法列表里面找,因为worker没有eat方法,找不到
  3. 通过worker的class对象的superclass找到Person的class对象
  4. 在Person的class对象的方法列表里面找,因Person有,找不到
  5. 通过Person的class对象的superclass找到NSObject的class对象
  6. 在NSObject的class对象的方法列表中找,找到了,调用

NSObject eat

可以发现,调用者始终是worker

如果NSObject里面也没有,那么就会报错

-[Worker eat]: unrecognized selector sent to instance 0x600000008910

类对象的isa和superclass的作用

原理同上
只不过用类对象的isa找到的是meta-class,通过superclass找到的是父类的meta-class,另外这次我们调用的是class方法

[Worker drink];

// drink的实现如下
+ (void)drink{
    NSLog(@"worker drink %@",self);
}

假设worker有drink方法

  1. 通过worker的class对象的isa找到worker的meta-class
  2. 在meta-class的方法列表中找,找到,调用

worker drink Worker

假设worker没有,person有

  1. 通过worker的class对象的isa找到worker的meta-class
  2. 在meta-class的方法列表中找,找不到
  3. 通过worker的meta-class对象的superclass找到person的meta-class对象
  4. 在person的meta-class对象的方法列表中找,找到,调用

person drink Worker

假设worker没有,person没有,NSObject的分类有

  1. 通过worker的class对象的isa找到worker的meta-class
  2. 在meta-class的方法列表中找,找不到
  3. 通过worker的meta-class对象的superclass找到person的meta-class对象
  4. 在person的meta-class对象的方法列表中找,找不到
  5. 通过person的meta-class对象的superclass找到NSObject的meta-class对象
  6. 在NSObject的meta-class对象的方法列表中找,找到,调用

NSObject drink Worker

假设worker没有,person没有,NSObject的分类也没有

按照我们前面说的,类方法只存在于meta-class中,调用worker的类方法,会依次找worker,person,NSObject的meta-class,那假如连NSObject的meta-class也没有,正常来想应该会报错,让我们注释掉NSObject里面的drink实现,果然报错

+[Worker drink]: unrecognized selector sent to class 0x100002d50

假设worker没有,person没有,NSObject的分类也没有,但是NSObject却有一个名为drink的对象方法呢?

按照我们前面说的,类方法只存在于meta-class中,调用worker的类方法,会依次找worker,person,NSObject的meta-class,那假如连NSObject的meta-class也没有,NSObject却有一个名为drink的对象方法会发生什么呢?答案是会调用这个名为drink的对象方法

//NSObject的对象方法drink
- (void)drink{
    NSLog(@"对象方法 NSObject drink %@",self);
}

对象方法 NSObject drink Worker

果然打印了对象方法,这简直是太出人意料了,调用类方法最后却调用了对象方法,这是为什么呢?这也是官方示意图中root class的meta的superclass指向了自身的class对象的结果

meta的isa和superclass

meta-class的isa都指向根对象的meta-class,根对象的meta-class的isa指向自己,换成具体的例子就是

  1. worker的meta-class的isa指向NSObject的meta-class
  2. person的meta-class的isa指向NSObject的meta-class
  3. NSObject的meta-class的isa指向NSObject的meta-class

meta-class的superclass指向

  1. worker的meta-class的superclass指向person的meta-class
  2. person的meta-class的superclass指向NSObject的meta-class
  3. NSObject的meta-class的superclass指向NSObject的class

推荐👇:

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:891488181 ,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

申请即送:

  • ——点击加入:iOS开发交流群

  • BAT大厂面试题、独家面试工具包,

  • 资料免费领取,包括 数据结构、底层进阶、图形视觉、音视频、架构设计、逆向安防、RxSwift、flutter,

文章到这里就结束了,你也可以私信我及时获取最新资料。如果你有什么意见和建议欢迎给我留言。想要学习的就来,不想的..........那就算了吧,反正白嫖的你都不要。

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

推荐阅读更多精彩内容