共计 4243 个字符,预计需要花费 11 分钟才能阅读完成。
iOS 技术栈
这里按我的了解给 iOS 相干技术分个类,以工程实现的角度,分成了根底、需要、效率、品质四个类别。根底指程序开发和 iOS 开发的基础知识和技能,需要就是产品的需要,有了根底技能,实现了产品需要后,剩下的事件就都是为了进步我的项目品质和晋升开发效率。
iOS 开发交换技术群:563513413,不论你是大牛还是小白都欢送入驻,分享 BAT, 阿里面试题、面试教训,探讨技术,大家一起交流学习成长!
根底
根底包含语言、框架、内存、网络、存储、渲染、线程。
语言目前 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 这种新型数据库,也值得理解一下。
内存方面,须要理解 OC 的援用计数、ARC 机制、主动开释池等相干点,最好其余语言的垃圾回收机制也有所理解,另外须要留神防止内存泄露,治理好客户端的缓存,防止缓存太多导致 OOM,或缓存命中率太低性能低下。
渲染方面次要是文字和图像,根底上文字方面 UIKit 已封装得很好,CoreText 也提供了更自在的排版渲染形式,图像渲染只须要留神解压机会,再深刻须要理解 iOS 具体的渲染机制,像图层混合,渲染机会,离屏渲染等,才好做更多的优化。
线程和过程方面,iOS 开发只在做 Extension 时才须要思考到过程,个别只需解决好线程,须要理解主线程子线程,多线程并发锁竞争,死锁,GCD,Runloop 等知识点。
需要
需要方面权且概括为一般需要、非凡需要和经营需要。
一般需要就是下面提到的网络拉数据 -> 存储 -> 读取 -> 展现,大多数 APP 次要都是在实现这类需要,相熟上述的基础知识后就能轻易实现。
非凡需要是指一些特定 APP 的需要,像浏览器内核,文字排版引擎,音视频和图像处理引擎,图标绘制引擎等,要求较高,都须要在相干畛域里较深刻的钻研能力做好。
经营需要是 APP 上线后继续经营过程中的需要,包含性能动态化,能够随时增删改线上的性能,个别这块由内嵌 web 承当。配置零碎也算动态化的一种,能够通过各种开关管制展示的性能。统计零碎记录 APP 各项经营数据,包含用户增长状况,留存率,性能应用状况等。事件流能够分明看到用户在 APP 里的应用流程。有些 APP 还会开发举荐零碎,依据收集来的数据给不同用户推送不同内容,进步用户转化率等。
品质
越大的 APP 会花越多的精力在保障和进步 APP 品质上,包含性能优化,搭建监控体系,晋升代码品质,保障平安,以及通过测试保证质量。
性能优化范畴很大,在网络 / 存储 / 内存 / 渲染 / 算法各方面都有优化的可能,个别性能上的优化能够分成三步走,一是检测各方面的数据,量化运行性能,二是从中找到性能瓶颈,三是找方法优化,用第一步的数据验证优化成果。
监控体系在面向公众用户的产品里无论是前端后端始终都是十分重要的,你须要时刻晓得用户在应用你的产品过程中有没有产生什么问题,让你的 APP 处于可知可控状态,客户端最常见的监控点是 crash,这个无需多说,另外个别对于 APP 里的错误码,包含本地谬误、网络谬误等都须要监控起来,这样在出现异常时能力即时得悉进行解决。其余通用的监控包含卡顿监控、数据库监控、流量耗费监控、内存耗费监控、各种耗时监控等等,还有各类业务相干的监控,越大的 APP 监控的我的项目就越多越粗疏,目标都是及时发现问题,以及掂量 APP 的品质。除了监控问题外,这里还须要做好出错时的补救措施,能够通过预埋性能开关配置或接入热修复的库去做。
平安方面,客户端上平安的重量绝对于服务端是少很多,尤其是在 iOS 零碎沙盒机制的爱护下,自身曾经比拟平安,最须要留神的是网络传输的平安,防止网络传输内容被篡改,或泄露了用户名明码等敏感信息。对于代码里有机密信息的能够思考混同代码对 APP 进行加固,缩小被破解的概率。
代码品质次要存在于团队合作上,个别团队都会定义代码标准,让大家的代码格调趋于统一,有些会开发代码标准检测工具,确保提交的代码遵循代码标准。另外很多团队都会履行 code review 机制,相互查看代码,缩小脏乱差代码呈现的概率,具体 review 机制各有不同。
测试是一个业余,国内终端产品因为迭代快,常见的是黑盒测试,尽管不能保障无问题,但老本低效率高,局部稳固的外围性能会做单元测试,也有一些团队所有业务性能都做自动化测试的。
效率
客户端的架构能够说都是为了进步开发合作效率,因为性能能够用很多种办法实现,能够不须要什么架构,无论是大型还是小型 APP 都能够按一套来实现,只不过差的架构在中大型 APP 上代码会很凌乱,导致在开发 / 合作 /debug 上效率会越来越低,好的架构则会晋升这里的效率。大多数架构都是分层形象和解耦,把性能独立的组件抽离进去,业务模块化,分层职责清晰,相互不耦合。只有分层形象和解耦做得足够好,无论多大的 APP 都是很多小模块的拼接,就能够升高复杂度,进步开发效率。但有时解耦会带来通信的麻烦,形象也有粒度大小的问题,这些都须要依据具体情况衡量。业界有各种各样的架构模式可供参考,像 MVC / MVVM / MVP / VIPER 等。除理解耦和形象,还有一些扭转编形式的架构,像响应式编程,单向数据流等。
继续集成的意思是一直把每个人做的货色(代码 / 资源等)集成到一起输入成品,进行自动化构建,其中波及代码治理(git / svn),编译流程,证书和签名机制,自动化测试,打包公布等。其中还会有一些自定义的自动化流程,例如主动生成代码,依据 debug / release 包类型主动更改配置等,反复做的事都应该自动化,以进步开发效率。
业界为了晋升开发效率,跨平台开发始终是大家手不释卷谋求的指标。
进阶
列完 iOS 开发的相干知识点,接下来说说怎么学习进步。
如果自学能力强的话,不须要多说,上述每个点网上都有大量材料,像内存网络存储这些计算机基础知识也有经典的书籍,一个个啃上来就行了,只有了解得足够深刻,就曾经能够成为畛域里的专家,并很容易举一反三。
但这种学习办法会比拟干燥,也难以实际,集体还是比拟举荐在实践中学习,具体来说就是在平时开发过程中一直地发现问题 -> 解决问题。
发现问题
首先你最益处在一个有很多工程上的问题急需解决的环境里,这样发现问题就很容易,最好的是处于这几类我的项目里:
处于高速发展期的我的项目。增长会带来很多问题,所有又未成熟,解决这些问题是十分天然又有价值的。
宏大的我的项目,超级 APP 会带来很多中小型 APP 没有遇到过的问题,又因为体量大,就算只有千分之一的人遇到也会影响几十万人,很有解决的价值,会有很多粗疏的问题。
像下面提到的有“非凡需要”一类的我的项目,须要在一个畛域里深入研究,也会天然碰到很多问题。
如果凑巧没有在这三种类型的我的项目里,也没关系,只有是衰弱倒退的我的项目,总会存在问题和优化空间,只是要造就发现问题的意识,很多时候问题就在那里,但没人发现它,没人感觉它能够 / 应该解决。能够按上述列的点,在相干点上多问本人能不能提高效率和品质,例如能不能进步前后台联调效率,反复写的代码能不能主动生成,启动耗时能不能短一点,线上问题发现和排查的效率能不能进步等等。各种问题会涵盖上述提到的所有知识点。
如果可怜你的我的项目没有衰弱倒退,切实没碰到什么问题或者问题不值得解决,或者你还没毕业,那这里还有一个万能问题可供参考:那些出名的开源我的项目具体是怎么实现的?分析开源我的项目源码能够学到很多货色,各种各样的开源我的项目也笼罩了很多知识面,只有深刻去钻研它们,学习它的架构和编码,不懂的中央再去补齐常识,也是个很好的学习形式,如果学习后能输入文章成果会更好,相当于入手实际了。
解决问题
不同的解决问题的形式差异很大,有一些常见的套路可供参考:
- 业界是怎么解决这个问题的?他们的计划有什么有余?我怎么能够做得更好?
业界有各种各样的开源库和技术分享,只有问题不是太偏门,大多会有人曾经提出解决方案,多比照和钻研这些已有的计划,看它们是否能满足需要,找出它们的长处和有余,看看能不能做得比它们更好或更适宜解决碰到的问题。
2. 解决方案是否通用化,封装成开源库供其余我的项目应用?
开源我的项目都是这样来的,如果遇到一个他人没解决好的问题,别错过封装成开源库造福社会。
3. 有没有方法避免当前呈现相似的问题?
有些问题可能会重复呈现,能不能避免,或者能不能在呈现问题的时候能及时发现和修复,这可能波及到开发流程、自动化和监控体系等方面的欠缺。
4. 总结积淀
能不能总结出解决这类问题的方法论(套路)?最好能输入文章或分享,写的过程是很好的学习过程,因为要把本来含糊的想法都清晰地表达出来,迫使本人去整顿思路。
总结
这里按我的了解列了 iOS 相干技术点,以及在实践中晋升能力的一点小倡议,可能无奈各方面都笼罩到,只是作为一个参考。另外这里只局限在 iOS 开发上,实际上作为程序员不应该限度本人学习的范畴。