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

  • 相关阅读:
    mysql 安装命令
    MySQL——修改root密码的4种方法(以windows为例)
    正则表达式(一):php常用的正则匹配
    nginx+php在调试过程中临时关闭缓存
    (总结)Nginx配置文件nginx.conf中文详解
    理解Linux系统/etc/init.d目录和/etc/rc.local脚本
    关于mongodb ,redis,memcache之间见不乱理还乱的关系和作用
    angularjs factory,service,provider 自定义服务的不同
    使用loopback创建nodejs框架
    采用express创建nodejs服务器
  • 原文地址:https://www.cnblogs.com/wangchan/p/8781009.html
Copyright © 2020-2023  润新知