一、设计模式
1.1概念:一套被反复使用、易理解、保证代码可靠性的代码设计经验的总结;与编程语言无关的成熟的编程思想。
1.2六大设计原则:单一职责、开闭、接口隔离、依赖倒置、里氏替换、迪米特
1.2.1单一职责原则:一个类只负责一件事。如UIView事件传递、响应;CALayer动画视图显示。
1.2.2开闭原则:对修改关闭,对扩展开放。对类的成员变量定义避免反复改;对类的数据结构定义好后提供接口(包括子类继承)
1.2.3接口隔离原则:用多个专门协议且协议中方法尽量少,避免一个臃肿庞大的协议。如tableView的delegate和datasource
1.2.4依赖倒置原则:抽象不依赖具体实现,而具体实现依赖于抽象。如数据的增删查改接口方法,所有的上层业务调用都依赖于定义好的抽象接口,而接口内部存储相关的变量、参数和具体实现是用数据库文件、plist、userdefault是上层业务感知不到的。
1.2.5里氏替换原则:父类可被子类无缝替换,且原有功能不受影响。如KVO调用addObserver方法时,系统悄无声息地在动态运行时创建子类并替换父类。
1.2.6迪米特法则:一个对象对其他对象尽可能少了解,高内聚、低耦合
1.3三大类:创建型、结构型、行为型
1.3.1创建型:对象实例化的模式,用于解耦对象的实例化过程。常见:单例模式、工厂方法模式等。
单例:注意1.定义的类方法shareInstance内部:定义静态局部变量,通过dispatch_once确保instance在多线程环境下只被创建一次,创建和初始化都是用[[super allocWithZone:NULL]init]; 避免第一次初始化对象时产生循环引用
注意2.重写allocWithZone 在不通过已定义的sharedInstance而是直接调用allocWithZone:方法创建对象时使用
注意3.重写copyWithZone 外界可能通过copy创建对象,这样保证一对象在app生命周期只创建一次。
1.3.2结构型:类和对象结合在一起形成更大的结构。常见:代理、桥接模式、适配器、组合、装饰等。
桥接:解决列表与多层网络数据耦合的问题。
适配器:现有类适应变化。原有类即被适配对象以成员变量的形态集成到被适配对象。
常见的有:对象适配器、类适配器
1.3.3行为型模式:类或对象之间如何交互、划分责任和算法。常见:观察者、命令模式、责任链模式等。
责任链:解决业务需求顺序调整的问题,即调整next responder的指向。
定义业务号,每个业务号对应具体的类,做成key-value的plist文件由服务器端动态下发,调整响应的顺序。在代码中根据class的反射解析出对应的类,按数组顺序分别指定对应的下一个响应者。
二、架构
2.1概念:软件开发中的设计方案;类与类之间、模块与模块之间、客户端与服务端的关系。
2.2常见架构:苹果版MVC、MVC变种、MVP、MVVM、VIPER、CDD
三/四层架构:界面层(MVP、MVC、MVVM;列表页面)、业务层(加载数据)、网络层、本地数据层
2.3客户端整体架构: (时长/崩溃统计、网络第三方库)独立于App的通用层、通用业务层、(解耦、协调)中间层
2.4业务间解耦通信方式:OpenURL、依赖注入
依赖注入:业务C通过注入到中间层,中间层实现策略,业务A从中间层获取它所需要的方法或成员变量,从而解除A、C之间的耦合。
在iOS中用法:业务C注册protocol到中间层,同时实现代理方法返回给中间层具体的实际对象。业务A使用时通过与对方协商好的协议从中间层根据某方法获取遵从某一协议的实例,然后在业务A中能把这一实例当作完全遵从该协议的透明对象使用。
三、框架
3.1图片缓存框架:Manager内存磁盘网络 CodeManager图片压缩解压缩
3.1.1图片读写方式?读写过程是怎样?
以图片URL的单向hash值为图片访问的key存储在图片缓存框架中
3.1.2内存设计上考虑哪些问题?
存储的size、淘汰策略(先进先出队列方式、最近最久未使用LRU算法如近30分钟内是否用过) 注意:LRU定时检查,提高检查触发频率(每次读写时,前后台切换时),需注意开销!
3.1.3磁盘:
存储方式 大小限制(如100MB) 淘汰策略(某图存储距今超7天)
3.1.4网络:
图片请求最大并发量 请求超时策略 请求优先级
3.1.5图片解码:
不同格式解码方式 应用策略模式对不同图片格式解码 解码时机(磁盘读取后,网络请求后)
3.1.6线程安全:
3.2阅读时长统计框架:
3.2.1记录器(页面 流式 自定义式)不同分类场景记录的封装适配
3.2.2记录管理者(缓存 磁盘 上传器)
3.2.3如何避免记录数据丢失情况?
定时写磁盘 限定内存缓存条数,若超出就写磁盘
记录上传器 立刻、延时(前后台切换 从无网到有网 通用轻量接口)、定时上传
3.3RN数据流思想:
任何子或孙视图无权做自己的变化更新,必须把自己变化更新的消息传给根节点。
视图多叉树(父视图有多个子视图,每个子视图有多个子视图)对某叶子结点数据更新,需要通过反向更新回到根节点,同时根节点对其进行标记;然后由根节点自顶向下遍历,直到找到该被标记了的节点对其进行数据更新。
四、常见第三方库
AFNetworking
SDWebImage
Rac函数响应式编程