runtime/KVO等面试题

1.KVO内部实现原则

回答:1>KVO是基于runtime机制实现的

   2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。

派生类在被重写的setter方法实现真正的通知机制(Person->NSKVONOtifying Person)

Person类对象p设置self控制器且设置监听属性,就会调用observeValueForKeyPath方法,当Person类的属性被改变时,就会动态生成一个子类继承自Person类(NSKVONotifying_Person),重写setAge方法,内部调用父类setAge方法,通知监听器

[监听器  observeValueForKeyPath:@"age" ofObject:self change:@{} context:(void *)context];

原先age属性不改变时p对象 isa指向Person,当age属性改变时p对象 isa指向NSKVONotifying_Person(setAge重新内部就会传递变量至父类且通知监听器age属性改变)

2.是否可以把比较耗时的操作放在NSNotificationCenter中

回答:1>如果在异步发送通知,那么可以执行比较耗时的操作

2>如果在主线程发送通知,那么就不可以执行比较耗时的操作

图--2

图---1

3.Foundation对象与Core Foundation对象有什么区别

回答:1>Foundation对象是OC的,Core Foundation是C语言对象

2>Foundation对象和Core Foundation对象可以互相转换的,数据类型之间的转换

ARC:__bridge_retained/__bridge_transfer

非ARC:__bridge

4.不用中间变量,用两种方法交换A和B

回答:A= A + B

B= A -B

A = A - B

或者

A= A^B

B = A ^ B

A = A^B;

5.简单描述下对单例模式设计的理解?

回答:节省内存资源,一个应用就一个对象

6.什么是动态,举例说明

1>在程序运行过程才执行的操作,例如KVO的内部实现原理,一个类的属性值随着程序运行监听属性值的变化

7.runtime实现机制是什么,怎么用,一般用于嘛,你还能记得你所使用的相关头文件或者某些方法的名称吗?

回答:运行时机制,runtime库里面包含了跟类/成员变量/方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等,需要导入<objc/message.h><objc/runtime.h>

1>runtime,运行时机制,它是一套C语言库

什么是runtime?

2>实际上我们编写的所有OC代码,最终都是转成了runtime库的东西,比如类转成了runtime库里面的结构体等数据类型,方法转成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制)

3>因此,可以说runtime是OC的底层实现,是OC的幕后执行者

runtime有啥用?

1>能动态产生一个类、一个成员变量、一个方法

2>能动态修改一个类、一个成员变量、一个方法

3>能动态删除一个类、一个成员变量、一个方法

常见的函数、头文件

#import <objc/runtime.h> : 成员变量、类、方法

class_copyIvarList : 获得某个类内部的所有成员变量

class_copyMethodList : 获得某个类内部的所有方法

class_getInstanceMethod : 获得某个具体的实例方法(对象方法,减号开头)

class_getClassMethod : 获得某个具体的类方法 (加号)

method_exchangeImplementations : 交换2个方法的实现

#import <objc/message.h> 消息机制

objc_msgSend(...);

图解:平时用OC代码设置变量值都转成如下图所示

图解:runtime机制可以看到很底层的实现,甚至成员变量是私有的。

图解:runtime实现遍历所有成员变量

图解:使用runtime机制,UIImage类交换2个方法的实现(imageWithName和imageNamed)

但是如果在imageWithName方法内在调用imageNamed就会导致死循环。

交换2个方法的好处:以后一个大项目当中的一个方法使用过多,想动一些手脚和操作,就可以很方便实现。

图解:修改addObject方法不为空才添加到数组

图解:修改objectAtIndex方法并查看是否越界,如越界返回null,runtime还可防止程序崩溃

附注:self.book[4]执行实际调用objectAtindex方法。

iOS面试题04-runtime的更多相关文章

  1. iOS笔试题04

    1. Object-C有多继承吗?没有的话用什么代替?
 1> OC是单继承,没有多继承 2> 有时可以用分类category和协议protocol来代替多继承 2. Object-C有私 ...

  2. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  3. 试答卓同学的 iOS 面试题

    卓同学昨天写了一篇文章<4道过滤菜鸟的iOS面试题>.我手痒决定默写一个参考答案.后来发现不认真回答被大家喷成狗,所以决定积极改造,重新做人.下面就是修编之后的答案. 1. struct和 ...

  4. iOS面试题大全-点亮你iOS技能树

    所有的内容大部分来自于网络的搜集,所以我不是一个创造者,而是一个搬运工.我尽量把题目,尤其是参考答案的出处列明.若有任何疑问,建议,意见,请联系我. 第一部分面试题来源于iOS-Developer-I ...

  5. ios 面试题 经典(比较全) 根据重点总结

    史上最全的iOS面试题及答案 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encodin ...

  6. YouKu iOS笔试题一

    序言 最近收到某某同学将去youku的iOS笔试题的邮件,希望笔者能整理一下,并提供参考答案.笔者决定整理出来,并分享给大家.当然,与此同时,也想看看youku的笔试题到底有多难,也考考自己有多少料吧 ...

  7. ios面试题1

    iOS面试题   1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSS ...

  8. 大厂常问iOS面试题--多线程篇

    1.进程与线程 进程: 1.进程是一个具有一定独立功能的程序关于某次数据集合的一次运行活动,它是操作系统分配资源的基本单元. 2.进程是指在系统中正在运行的一个应用程序,就是一段程序的执行过程,我们可 ...

  9. 大厂常问iOS面试题--性能优化篇

    1.造成tableView卡顿的原因有哪些? 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候 ...

  10. 2020年,大厂常问iOS面试题汇总!

    Runloop & KVO runloop app如何接收到触摸事件的 为什么只有主线程的runloop是开启的 为什么只在主线程刷新UI PerformSelector和runloop的关系 ...

随机推荐

  1. Oracle EBS-SQL (SYS-20):OPM接口处理.sql

    /* 未加工的材料交易(必须解决) UNcosted Transactions (must resolve) 无成本的交易(必须解决) Pending WIP costing transactions ...

  2. Cloning Java objects using serialization

    Sometimes you need to clone objects, and sometimes you can't use their clone method, and sometimes s ...

  3. 桂林电子科技大学出校流量控制器Android版1.0.0

    每次玩游戏的时候,总是要开着电脑挂着出校控制器,真是浪费国家资源啊,,, 突然想起学校有个开放流量的网页,无奈UC等浏览器真是尝试优化js脚本啊,挂在后台,不到几分钟就掉线了,悲剧啊~~~ 还好And ...

  4. 【菜鸟学习Linux】-第一章-Linux环境搭建-安装VMware虚拟机

    本人菜鸟一个,刚毕业才上班2个月,现在用到Linux部署项目,这才开始学习Linux,以下是我在安装Linxu系统是遇到的一些问题,希望能给广大菜鸟们在学习的道路上提供帮助和指导,废话不多说!开工! ...

  5. 开源 免费 java CMS - FreeCMS1.9 简历管理

    项目地址:http://code.google.com/p/freecms/ 简历管理 管理当前管理网站的简历数据. 1. 回复简历 选择须要回复的简历.然后点击"回复". 注意: ...

  6. .wsdl文件生成.cs文件

    1.打开VS文件命令行工具(一般在安装文件的Common7\Tools\Shortcuts下面例如[E:\VS2013安装程序\Common7\Tools\Shortcuts\VS2013 x64 本 ...

  7. 张孝祥Java高新技术汇总

    一.自动装箱和拆箱: 在Java中有8种基本数据类型:byte,short,int,long,float,double,char,boolean.而基本数据类型不是对象,这时人们给他们定义了包装类,使 ...

  8. C++中的栈和队列

    使用标准库的栈和队列时,先包含相关的头文件 #include<stack> #include<queue> 定义栈如下: stack<int> stk; 定义队列如 ...

  9. 1)③爬取网易It方面部分新闻

    __author__ = 'minmin' #coding:utf-8 import re,urllib,sgmllib,os #根据当前的url获取html def getHtml(url): pa ...

  10. 对discuz的代码分析学习(二)首页文件

    如果当前地址栏存在查询字符,并且是一个数字,条件成立. 查询字符:www.baidu.com/index.php?aaa=bbb              aaa=bbb就是查询字符如果条件成立,则把 ...