关于Runtime一些面试题的整理

1.Category的实现原理?

  • Category实际上是Category_t的结构体,在运行时,新添加的方法,都被以倒叙插入到原有方法列表的最前面,所以不同的Category,添加了同一个方法,执行的实际上是最后一个。
  • Category在刚刚编译完的时候,和原来的类是分开的,只有在程序运行起来后,通过Runtime,Category和原来的类才会合并到一起。

2.isa指针的理解,对象的isa指针指向哪里?isa指针有哪两种类型?

  • isa指针等价于is kind of
    实例对象的isa指向类对象
    类对象的isa指向元类对象
    元类对象的isa指向元类的基类
  • isa有两种类型
    纯指针,指向内存地址
    NON_POINTER_ISA,除了内存地址,还存有一些其他信息

3.Objective-C如何实现多重继承?

object-c的类没有多继承,只支持单继承,如果要实现多继承的话,可使用如下几种方式间接实现:

  • 通过组合实现
    A和B组合,作为C的组件
  • 通过协议实现
    C实现A和B的协议方法
  • 通过消息转发实现
    forwardInvocation:方法

4.runtime如何实现weak属性?

weak此特质表明该属性定义了一种「非拥有关系」(nonowning relationship)。为这种属性设置新值时,设置方法既不持有新值(新指向的对象),也不释放旧值(原来指向的对象)。
runtime对注册的类,会进行内存布局,从一个粗粒度的概念上来讲,这时候会有一个hash表,这是一个全局表,表中使用weak指向的对象内存地址作为key,用所有指向该对象的weak指针表作为value。当此对象的引用计数为0的时候回dealloc,假如该对象内存地址为a,那么就会以a为key,在这个weak表中搜索,找到所有以a为键的weak对象,从而设置为nil。

  • runtime实现weak属性具体流程大致分为3步:
    1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。
    2、添加引用时:objc_initWeak函数会调用objc_storeWeak()函数,objc_storeWeak()的作用是更新指针指向(指针可能原来指向着其他对象,这时候需要将该weak指针与旧对象解除绑定,会调用到weak_unregister_no_lock),如果指针指向的新对象非空,则创建对应的弱引用表,将weak指针与新对象进行绑定,会调用到weak_register_no_lock。在这个过程中,为了防止多线程中竞争冲突,会有一些锁的操作。
    3、释放时:调用clearDeallocating函数,clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组,把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。

5.讲一下OC的消息机制?

  • OC中的方法调用其实都是转成了objc_msgSend函数的调用,给receiver(方法调用者)发送了一条消息(selector方法名)。
  • objc_msgSend底层有3大阶段,消息发送(当前类、父类中查找),动态方法解析,消息转发

6.runtime具体应用?

  • 利用关联对象(AssociatedObject)给分类添加属性
  • 遍历类的所有成员变量(修改textField的占位文字颜色、字典转模型、自动归档接档)
  • 交换方法实现(交换系统的方法)
  • 利用消息转发机制解决方法找不到的异常问题
  • KVC字典转模型

7.runtime如何通过selector找到对应的IMP地址?

每一个类对象中都有一个对象方法列表(对象方法缓存)

  • 类方法列表是存放在类对象中isa指针指向的元类对象中(类方法缓存)
  • 方法列表中每个方法结构体中记录着方法的名称,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现
  • 当我们发送一个消息给一个NSObject对象时,这条消息会在对象的类对象方法列表中查找
  • 当我们发送一个消息给一个类时,这条消息会在类的Meat Class对象的方法列表中查找

8.简述下Objective-C中调用方法的过程?

Objective-C是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver,selector),整个过程介绍如下:

  • objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类
  • 然后再该类中的方法列表以及其父类方法列表中寻找方法运行
  • 如果在最顶层的父类(一般也就NSObject)中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX
  • 但是在这之前,objc的运行时会给出三次拯救程序崩溃的机会,这三次拯救程序崩溃的说明见问题《什么时候会报unrecognized selector的异常》中的说明。

9.load和initialize的区别

两者都会自动调用父类的,不需要super操作,且仅会调用一次(不包括外部显示调用)。

  • load和initialize方法都会在实例化对象之前调用,以main函数为分水岭,前者在main函数之前调用,后者在之后调用。这两个方法会被自动调用,不能手动调用它们。
  • load和initialize方法都不用显示的调用父类的方法而是自动调用,即使自雷没有initialize方法也会调用父类的方法,而load方法则不会调用父类。
  • load方法通常用来进行Method Swizzle,initialize方法一般用于初始化全局变量或静态变量。
  • load和initialize方法内部使用了锁,因此它们是线程安全的。实现时要尽可能保持简单,避免阻塞线程,不要再使用锁。

10.怎么理解Objective-C是动态运行时语言?

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

推荐阅读更多精彩内容

  • 1,runtime 如何动态添加方法和属性和动态属性控制 通过苹果官方文档查看,我们可以发现runtime的内部存...
    携YOU手同行阅读 916评论 0 0
  • 面试题链接http://www.swifty.cc/740.htm 1.为什么说Objective-C是一门动态的...
    保持前行阅读 594评论 0 0
  • UIKit 1.UIView 和 CALayer 是什么关系? UIView 继承 UIResponder,而 U...
    Sephiroth_Ma阅读 2,207评论 0 25
  • 【※】@property中有哪些属性关键字? 访问控制组 nonatomicatomic 内存管理组 weakst...
    iOS_肖晨阅读 668评论 0 51
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    sumrain_cloud阅读 341评论 0 1