iOS【面试】设计模式篇
1、 MVC、MVVM、MVP的区别以及使用的优缺点是什么?
(1)MVC:
- MVC中V和C之间的关系:C可以控制V的渲染这部分, V起显示作用, 同时V上发生的用户事件也可以给C来做一些处 理;
- C和M之间的关系:C可以修改M;
- M跟V之间的关系:M可以改变V, V读取M给它提供的数据, 可以展示界面;
- MVC中, V跟M之间是有依赖关系的. 在使 MVC的时候, 网络是从C中发起的, C整体来说承担的业务逻辑会比较大, 它起到了控制V和M的作用;
(2)MVP:
- MVP是面向协议编程,V跟Model之间是完全没关系的, 他们之间不存在引用和依赖关系. 耦合的操作全部由 Presenter来进行处理;
- 网络请求在Model中发起, 把数据传给P来进行处理, V也是一样,它要拿数据, 就遵守P提供的协议, 实现P给它提供的协议方法. 获取数据之后, 就可以进行展示了. 当然它的一些发起操作还是由C来进行. MVP中C里的代码很少, 主要逻辑由P来处 . 由于是面向协议编程, 所以在开发的时候, 完全可以把网络那层封装起来,V和C完全没必要关心网络那层;
2、 MVC经典的架构中说说有哪些常用的设计模式?
- (1)通知跟kvo都是属于观察者模式, 观察者模式和代理模式就不多解释了.
- (2)target-action在Controller和view之间,使用的就是命令模式, 一般开发中也常称为target-action模式. 在 iOS中NSInvcation也使用了一种典型的命令模式;
- (3)MVC中, Model和View是没有关联的, 他们之间的传递由Controller来完成, 其实Controller在这里起到的作用相当于是一个中介者,MVC也是一种简单的中介者模式.;
- (4)策略模式, 一般用在解决if else和switch-case中的繁琐逻辑,可以根据算法分离出不同的类,作为策略. 可以起到解耦合的作用;
3、 怎么解决iOS打包成功之后,运行在iPhone上会闪退、黑屏的问题?
(1)证书错误;
(2)当前的设备并不在开发者对应的账号里面;
(3)有一些闪退, 像ios10的时候, 要我们加的那个访问权限, 如相机的访问,就是在plist 件加上;
(4)怎么检测当前的设备是否在开发者的证书里,你有开发者账号,直接登录app即可获得,但是没有开发者账号的情况我们该怎么办? 答案在打开包后的文件里面可以看到;
4、 说一说OC中字典的实现原理?
- 大部分语言字典的底层是一个哈希表
- 哈希表: 本质就是一个数组
- 哈希: 1. md5 2. 哈希算法 .....
- 哈希表中具体的存储操作原理,见:XXXX
5、 iOS中的消息发送机制和消息转发机制的区别?
- 消息发送机制: 使用了运行时, 通过selector快速去查找IMP的一个过程,方法在执行的时候, 编译器会把方法编译成objc_msgSend()函数;
- 消息转发机制:IMP找不到的时候, 通过一些方法做转发处理;
6、 组件间的通讯, 是通过什么方式来做的, 请详细的解释一下?
- 采用路由的方式, 通过路由的方式来实现模块之间业务的调转, 主工程跟模块之间, 不直接引用. 模块与模块之间也不直接引用. 直接引用的时候, 依赖性会更强. 在中间引入的router, 可以降低耦合性 ;
- router中采用了target_action 以及 NSInvocation 来进行实现,它们其实是一种命令模式;
7、 SDWebImage是怎么来清理缓存的?
- 清理缓存有两种方式:
1.根据时间周期来清理. 2.根据定义的磁盘大小来清理.
- 根据时间周期清理步骤:
(1)找磁盘缓存目录;
(2)使用目录枚举器, 根据传入的key获取缓存文件;
(3)获取超过7天的文件;
(4)把超过7天的文件放到一个数组里面, 统一进行删除;
(5)把没有过期的文件存起来, 并计算文件的总大小;
- 根据定义的磁盘大小清理
(1)如果设置了磁盘的最大存储. 最大的缓存大于零, 并且当前的缓存大小已经大于最大的缓存 大小;
(2)清除缓存, 直到缓存到达最大缓存的一半;
(3)清除的时候, 虽然图片没有过期, 它也会根据时间最老的来先删;
8、 SDWebImage是怎么处理接收的内存警告的?
- 用的是AutoPurgeCache 这个类来处理内存警告,这个类是继承自NSCache;
- 发现内存警告, 就直接全部清理掉, 它的实现很简单 ;
9、 SDWebImage中怎么计算图片的成本大小?
- 计算图片占用的内存大小:高*比例因子*宽*比例因子
- 计算在缓存中的大小. 在同步的队列里面, 获取图片的路径,拿到图片之后,依次进行叠加
10、SDWebImage中clear和clean有什么样的区别?
-
clear 全部清空, 把整个文件夹都删除了. 然后再创建同名的文件夹;
-
clean 清除一部分,第一是根据时间周期来清理, 第二是根据设置的缓存大小来清理;