iOS面试题整理

113 阅读5分钟
1,类别的作用:
  1. 将类的实现分散到多个不同文件或不同框架中
  2. 创建对私有方法的前向引用
  3. 向对象添加非正式协议
2,层和UIView的区别是什么?

参考答案:
两者最大的区别是,图层不会直接渲染到屏幕上,
UIview是iOS系统中界面元素的基础,所有的界面元素都是继承自它。
CALayer它本身完全是由CoreAnimation来实现的。它真正的绘图部分。是由一个CALayer类来管理的。
UIView本身更像是一个CALayer的管理器。一个UIView上可以有n个CALayer,每个layer显示一种东西。增强UIView的展示能力。

3.TCP/UDP区别联系?

参考答案:
TCP—传输控制协议,提供的是面向连接,可靠的字节流服务。
当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。
TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据从一端传到另一端。
UDP—用户数据报协议。是一个简单的面向数据报的运输层协议。
UDP不提供可靠性。它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。
由于UDP在传输数据报前不用在用户和服务端之间建立一个连接,且没有超时重发等机制。故而传输速度很快

4,NSOperation与GCD的主要区别?
  1. GCD 基于C语言的底层API,GCD主要与block结合使用,代码简洁高效。\
  2. NSOperation 属于Objective-C类,是基于GCD更高一层的封装。复杂任务一般用NSOperation实现。
  3. 依赖关系,NSOperation可以设置两个NSOperation之间的依赖,第二个任务会在第一个任务完成后再执行,但是GCD无法设置依赖关系,不过可以通过dispatch_barrier_async来实现这种效果;
  4. 通过KVO(键值观察)的方式,在NSOperation中很容易判断Operation当前的状态(是否执行、是否取消等),但是GCD无法通过KVO进行判断;
  5. 优先级,NSOperation可以设置自身的优先级,但是优先级高的不一定先执行,GCD只能设置队列的优先级,无法在执行的block设置优先级;
  6. 继承性,NSOperation是一个抽象类,实际开发中常用的两个类是NSInvocationOperation和NSBlockOperation,同样我们可以自定义NSOperation,GCD执行任务可以自由组装,没有继承那么高的代码复用度;
  7. 效率,直接使用GCD效率确实会更高效,NSOperation会多一些开销,但是通过NSOperation可以获得“依赖”、〝优先级”“继承”、“键值对观察”这些优势,虽然多了一些开销但是在实际开发中效益率很大。
5,什么是 RunLoop
  • 从字面上看,就是运行循环,跑圈
  • 其实它内部就是do-while循环,在这个循环内部不断地处理各种任务(比如Source、Timer、Observer)
  • 一个线程对应一个RunLoop,基本作用就是保持程序的持续运行,处理app中的各种事件。
  • 通过runloop,有事运行,没事就休息,可以节省cpu资源,提高程序性能。
  • 主线程的run loop默认是启动的。
6,说说你对 runtime 的理解

Runtime又叫运行时,是一套底层的C语言API,其为iOS内部的核心之一,我们平时编写的OC代码,底层都是基于它来实现的。
有了Runtime库,能做什么事情呢?
Runtime库里面包含了跟类、成员变量、方法相关的API。\

比如:

(1)获取类里面的所有成员变量。
(2)为类动态添加成员变量。
(3)为类动态添加新的方法。
(4)动态改变类的方法实现等。(Method Swizzling)

因此,有了Runtime,想怎么改就怎么改。

7,什么是 Method Swizzle(黑魔法),什么情况下会使用?

1). 在没有一个类的实现源码的情况下,想改变其中一个方法的实现,除了继承它重写、和借助类别重名方法暴力抢先之外, 还有更加灵活的方法 Method Swizzle。
2). Method Swizzle 指的是改变一个已存在的选择器对应的实现的过程。OC中方法的调用能够在运行时通过改变类的调度表中选择器到最终函数间的映射关系。
3). 在OC中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用OC的动态特性,可以实现在运行时偷换selector对应的方法实现。
4). 每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。IMP有点类似函数指针,指向具体的方法实现。
5). 我们可以利用 method_exchangeImplementations 来交换2个方法中的IMP。
6). 我们可以利用 class_replaceMethod 来修改类。
7). 我们可以利用 method_setImplementation 来直接设置某个方法的IMP。
8). 归根结底,都是偷换了selector的IMP。

8,消息转发的三次补救?

-(BOOL)resolveInstanceMethod:(SEL)selector      resolveClassMehtod

-(id)forwardingTargetForSelector:(SEL)selector

methodSignatureForSelector    - (void)forwardInvocation:(NSInvocation *)invocation