iOS面试题

一、runtime的实现机制是什么?实现的应用场景?相关函数?缓存

runtime是一套比较底层的纯C语言API。 OC代码在程序运行时, 其实最终都是转成了runtime的C语言代码, 它是OC的幕后工做者.
好比说,建立对象的方法中: 
[[Person alloc] init] 
-->
objc_msgSend(objc_msgSend("Person" , "alloc"), "init")

应用场景:能够进行一些很是底层的操做(用OC是没法现实的, 很差实现)

在程序运行过程当中, 动态建立一个类(好比KVO的底层实现);

在程序运行过程当中, 动态地为某个类添加属性\方法, 修改属性值\方法的实现;

遍历一个类的全部成员变量(属性)\全部方法(例如:当归档解档的时候属性比较多时,可使用runtime动态设置,不须要写不少的代码);

用于封装框架.当系统的方法不能知足逻辑需求的时候,能够利用运行时替换系统的方法,好比AFNetworking框架.

相关函数:
objc_msgSend : 给对象发送消息
class_copyMethodList : 遍历某个类全部的方法
class_copyIvarList : 遍历某个类全部的成员变量
class_..... 这是咱们学习runtime必须知道的函数!

二、runloop的底层实现原理是什么?应用场景?和线程的关系?服务器

其内部是一个 do-while 循环。当你调用CFRunLoopRun()时,线程就会一直停留在这个循环里;直到超时或被手动中止,该函数才会返回。
应用场景:
一、autoreleasePool

二、事件响应

三、手势识别

四、界面更新

五、定时器

六、PerformSelecter(利用RunLoop常驻线程)

七、GCD
runloop和线程的关系:
每条线程都有惟一的一个 RunLoop 对象与之对应的
主线程的 RunLoop 是自动建立并启动
子线程的 RunLoop 须要手动建立

三、kvo的底层实现网络

3.一、KVO是基于runtime机制实现的

3.二、当某个类的属性对象第一次被观察时,系统就会在运行期动态地建立该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制

3.三、若是原类为Person,那么生成的派生类名为NSKVONotifying_Person

3.四、每一个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法

3.五、键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变以前, willChangeValueForKey:必定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey:会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。

补充:KVO的这套实现机制中苹果还偷偷重写了class方法,让咱们误认为仍是使用的当前类,从而达到隐藏生成的派生类

四、APP 请求大量数据,致使服务器卡、返回数据慢,要如何进行优化多线程

4.一、减小radio活跃时间 ,也就是减小网络数据获取的频次,从而也减小了radio的电量消耗,控制电量使用。

4.二、减小获取数据包的大小,能够减小流量消耗,也可让每次请求更快,在网络状况很差的状况下也有良好表现, 提高用户体验.

具体实现:

4.三、API设计,App与Server之间的API设计要考虑网络请求的频次, 资源的状态等. 以便App能够以较少的请求来完成业务需求和界面的展现.
例如, 注册登陆. 正常会有两个API, 注册和登陆, 可是设计API时咱们应该给注册接口包含一个隐式的登陆. 来避免App在注册后还得请求一次登陆接口(有可能失败, 从而致使业务流程失败).

4.四、Gzip压缩,使用Gzip来压缩request和response, 减小传输数据量, 从而减小流量消耗.

4.五、网络缓存,适当的缓存, 既可让咱们的应用看起来更快, 也能避免一些没必要要的流量消耗.

4.六、打包网络请求,当接口设计不能知足咱们的业务需求时. 例如可能一个界面须要请求多个接口, 或是网络良好, 处于Wifi状态下时咱们想获取更多的数据等.
这时就能够打包一些网络请求, 例如请求列表的同时, 获取Header点击率较高的的item项的详情数据.
能够经过一些统计数据来帮助咱们定位用户接下来的操做是高几率的, 提早获取这部分的数据.

五、你用过NSOperationQueue么?若是用过或者了解的话,你为何要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和相似的地方(提示:能够从二者的实现机制和适用范围来描述并发

5.一、 GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装

5.二、 GCD只支持FIFO的队列,NSOperationQueue能够很方便地调整执行顺序、设置最大并发数量

5.三、 NSOperationQueue能够在轻松在Operation间设置依赖关系,而GCD须要写不少的代码才能实现

5.四、 NSOperationQueue支持KVO,能够监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)

5.五、 GCD的执行速度比NSOperationQueue快

任务之间不太互相依赖:GCD

任务之间有依赖\或者要监放任务的执行状况:NSOperationQueue

六、你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些须要在线程中建立或者传递?你是用什么样的策略来实现的?框架

 

七、block的实现原理异步

建立block的时候,内部是建立了对应的函数;

在调用block的时候,是调用了以前封装的函数。

八、你实现过一个框架或者库以供别人使用么?若是有,请谈一谈构建框架或者库时候的经验;若是没有,请设想和设计框架的public的API,并指出大概须要如何作、须要注意一些什么方面,来使别人容易地使用你的框架函数

抽象和封装,方便使用。首先是对问题有充分的了解:
好比构建一个文件解压压缩框架,从使用者的角度出发,只需关注发送给框架一个解压请求,框架完成复杂文件的解压操做,而且在适当的时候通知给使用者,如解压完成、解压出错等。
在框架内部去构建对象的关系,经过抽象让其更为健壮、便于更改。
其次是API的说明文档。

九、NSNotificationCenter通知中心是同步操做仍是异步操做?oop

NSNotificationCenter消息的接受线程是基于发送消息的线程的,也就是同步的。
所以,有时候,你发送的消息可能不在主线程,而你们都知道操做UI必须在主线程,否则会出现不响应的状况。
因此,在你收到消息通知的时候,注意选择你要执行的线程。

十、消息机制的流程吗/KVC的底层实现/weak的底层实现学习

 

十一、 sleep performal延迟操做默认在哪一个线程?

 

十二、GCD没有取消以前,是怎么取消已经派发的任务?

 

1三、以前开发项目实现过程,遇到过什么问题,如何解决?

 

1四、怎么处理死锁

产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已得到的资源保持不放。
(3) 不剥夺条件:进程已得到的资源,在末使用完以前,不能强行剥夺。
(4) 循环等待条件:若干进程之间造成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不知足,就不会发生死锁。
相关文章
相关标签/搜索