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 清除一部分,第一是根据时间周期来清理, 第二是根据设置的缓存大小来清理;

 

posted on 2018-04-11 18:00  北极星1992婵  阅读(138)  评论(0编辑  收藏  举报

导航