c++,iOS开发基础包括语言、框架、内存、网络、存储、渲染、线程。
语言目前 iOS 开发就是 OC 和 Swift,国内仍以 OC 为主,对于 OC 除了语法外,最好了解它的对象模型,动态机制等特性。Swift 方面若要在团队里使用,目前还是风险大收益小的,但个人最好保持对它的关注。
框架就是 Foundation / UIKit 以及苹果系统封装好的各种框架,Foundation 和 UIKit 每个做 iOS 开发的人都熟知这套,iOS 功能越来越多,苹果提供的框架也越来越多,像 StoreKit / MessageUI / AVFoundation 等可以在使用到再去了解。
接着是客户端里最常见流程里的四个关键部分:从网络拉取数据,存储到本地文件系统,再从本地取出来放进内存,最后渲染出来。而这里所有的处理都在操作系统的进程和线程中执行。
网络方面若要深入的话内容很多,客户端一般只需要关心 http / https / dns 这几个协议,了解 https 的原理,处理运营商劫持 dns 劫持等情况,另外需要处理好各种异常情况做好重试机制,iOS 作为移动端网络不稳定,要看情况优化弱网络下的连接,做好离线机制,以及注意避免耗费太多流量。还有客户端跟后台的通信协议,数据结构一般用 json 或 protobuf,由于客户端本地会保存一部分内容,很多 APP 都会需要做数据的增量更新。
存储方面主要是 sqlite,sqlite 作为存储引擎是大多数 APP 的核心,也是性能优化的关键点,最基本的需要知道主键索引事务等数据库基本概念,再深入需要了解具体的存储机制/索引的实现/sqlite的七层结构等,才能在遇到问题时找到最佳的解决方案。客户端上 nosql 用得较少,除了 sqlite 一般就剩单文件存储,XML存文件或对象序列化成二进制存储,也是常用的存储方式,近期有 realm 这种新型数据库,也值得了解一下。
c++后端开发使用 Epoll 边沿触发的 IO 多路复用技术,非阻塞 IO,使用 Reactor 模式
使用多线程充分利用多核 CPU,并使用线程池避免线程频繁创建销毁的开销
使用基于小根堆的定时器关闭超时请求
主线程只负责 accept 请求,并以 Round Robin 的方式分发给其它 IO 线程(兼计算线程),锁的争用只会出现在主线程和某一特定线程中
使用 eventfd 实现了线程的异步唤醒
使用双缓冲区技术实现了简单的异步日志系统
为减少内存泄漏的可能,使用智能指针等 RAII 机制
使用状态机解析了 HTTP 请求,支持管线化
支持优雅关闭连接