IOS开发2年半经验回顾
更新日期:
前言
本文主要是为进阶新层次而总结开发30个月以来的学习成果。为尽可能多地覆盖广度和深度,分别从几个大方面描述相关内容。
过程概述
objC
iOS开发所用的语言Objective-C是新兴的一门开发语言,大学并没有开设相关课程。但是,oc是从c语言衍生过来了,有很多c语言的特征,也有高级语言和面向对象语言的特征,电子和计算机专业相关的人学起来都比较容易上手。
语法入门
小编是从0开始学iOS开发的,2014年4月13日开始写下第一行iOS开发的代码。那时还没毕业,就出来培训iOS开发,觉得系统地学下基础来入门会更好,避免留下坏的编程习惯。
语法学习。各门语言都一样,一开始必须学习语法知识,才能看得懂、写得出代码。oc的语法,主要是函数调用和消息机制和c语言有差别,数据处理方面基本没变。
编程最难最痛苦的莫过于处理数据了。学习的数据类型及其转换、赋值、对比判断,选择分支和循环等等,都是用来处理数据的。
函数的格式换了一种,让函数更长更易读。
使用开发工具的能力一直在提升,那时只会用Xcode,Mac OS的基本使用也摸索得差不多,安装和破解个软件没什么压力。
UI入门
纯代码写各种UIView及其子类控件。一开始觉得难度大,但是写到后面发现很多共性,学会看接口和文档后,写新控件已经没什么压力。学UI的时候还学了手势和响应者链,了解苹果手机的一些系统实现机制。
学习了基础就是项目期,开始做项目。那时觉得学了很多技术了,做项目才知道很多知识用不到,该会的却没学。然后就是通过网上大量的技术博客恶补了。
第一份工作
做完项目就去找工作了,也许是小编基础比较扎实,技术总结归纳得好,一找就得到了工作。而且更幸运的是,我所做的项—-追追,是个完整的大项目,有大神之前已经写好很多代码了。
曾经我怀疑过他们的一些设计方式,也否定了部分代码细节,但是后来技术提升了才发现他们是对的,相关开发书籍就说了具体的利与弊。
开发追追的那段时间,我学会了很多技术,主要是UI开发和框架设计,即时聊天和发布APP还没着手。也是那时候开始学会封装接口,处理复杂的业务逻辑的。很怀念,因为只有那个时候老主管带过我,愿意教我技术。
第二份工作
这份工作到现在已经有19个月了。由于产品的更改频繁,总监要求高,在这个创业公司里,小编的实力突飞猛进,在此工作1年就感觉技术到达了瓶顶。一天天的加班,一版版的迭代,一次次的优化,小编在开发的哒哒运动项目里实现了各种炫丽的UI效果,处理过量大而结构复杂的数据。
最难的要数跑步画轨迹的功能了,逻辑多,计算麻烦,而且还要室外调试各种情况。LBS的功能很多都用得滚瓜烂熟了,包括地位、搜索和导航3大地图模块。
由于2.0版本前都是我主导整个项目,所以学习了全面的开发技术。以前没接触过的TestFlight测试、证书管理、线上崩溃追踪和性能调试等等都得到了很好的突破。小编是个好学的人,期间看了很多iOS开发书籍,印证了第一个项目的多处优秀代码。
由于公司业务的改变,所做的功能已经对技术提高不大,近半年来主要学习HTML开发。公司业务量并不大,小编同时开发H5和iOS都还比较轻松。那么接下来说说我在这次工作都实现了哪些功能吧。
- 搭建框架、优化框架,目录结构、工程设置、封装接口、封装基类等
- 编写开发计划文档、项目文档、SVN使用文档等
- 图片相关处理,获取、编辑、多图上传、加载、轮播、放大、裁剪、玻化滤镜、截屏、拼图等
- 各种各样的列表,瀑布流、用户图文动态、单级评论、盖楼评论、好友通讯录、类彩票中奖等
- 自定义各种弹窗,类系统警告框、actionSheet、加载动画等
- 地图功能,定位、经纬度编解码、POI搜索、导航、多样化标注、自定义覆盖物、实时天气等
- 手机系统功能,相册相机、麦克风、定位、通讯录、短信、健康数据、陀悬仪、通知、打电话、日历等
- 用户编辑、发布功能,图文动态发布、资料修改、创建类似活动的发布
- 即时聊天,长连接、XML CoreData 自定义类型 基本数据类型的数据转换、数据增删改查、消息中心、聊天键盘、聊天界面分页加载复制删除等功能
- 发布app,开发者账户管理、开发和发布证书及配置文件的管理、真机测试设备管理、app发布信息编辑、上传及TestFlight测试、处理各种提审及复审问题等
- 第三方SDK,AFNetworking SDWebImage MWPhotoBrowser AGImagePickerController JSONKit XMPPFramework MJRefresh FMDB MBProgressHUD OpenShare等
- 第三方开放平台,腾讯(登录分享)、微信(登录分享支付)、支付宝、新浪微博(登录分享)、友盟(统计、客服留言板)、个推、高德地图、“科大讯飞、环信(差点引入)”
- 性能,后台模式(定位、语音)、数据库快速写入、多个异步线程网络请求、UI渲染、内存泄漏优化等
- 音视频,录制、本地及网络播放、上传、下载、视频转码、视频缩略图等
- 数据库,CoreData、FMDB
阅读了千千万万的文档之后,做好以上功能已经没有压力了。但是由于APP的用户量不高,更精细的功能还有待进一步提高。
各模块技术
语法基础
主要学习了基本数据类型和id数据类型的基本用法和函数、类的语法等,包括运算、对比、转换和一些逻辑处理等,多是用于业务数据处理方面,属于很形象的一个就是MVC的model。这一块没有界面效果,都是在控制台进行的。
UI基础
学习了UIView及其子类的用法,手势交互及手机系统响应者链、APP结构等。几乎每一句都有相应的效果对应,学起来没那么抽象,也快很多。这部分就属于MVC的view和controller了。
应用开发
主要学习手机系统和app工作原理,应用组成,各界面切换等。涉及应用层的显示、交互、网络和更新等。这个模块和UI基础类似,却更深入学习了APP的架构和原理。
小数据存储
有归解档 archive、属性列表 plist、用户默认设置 NSUserDefault、文件管理 NSFileManager等。
它们的读写的接口都比较简单,按需选择来用就可以。
大数据存储
主要是数据库,包括原生sqlite,FMDB,CoreData,Realm等。
sqlite还是比较麻烦的,难度也大,毕竟是c代码的操作;CoreData有图形设置界面,接口也不多,即使是XMPP里的CoreData也是,但是难度也大;FMDB和Realm都是sqlite封装出来的,虽然用着会方便些,但是升级问题、安全问题还是得考虑进去,看着文档写很快就会了。
然后就是数据库的通用难点了。表的改变、关联,数据迁移升级等。
数据处理
主要是数据解析、组装及各种类型间的转换。
解析包括XML、JSON、Node节点、多层嵌套结果获取等。组装有集合和字符串处理等。转换一般是字典模型转换、基本数据类型、id类型、CF框架类型、xml、node节点、Coredata类型和自定义id类型等相互间的转换。
网络
处理封装接口就是实现加载动画和回调提示了。基本是都是使用AFNetworking的接口,再封装一层接口来用,主要是短连接的Post请求和多文件上传。即使是断点续传,也都被封装好了的。当然,它的实现原理还是知道的。简单地说就是,开个异步线程,创建一个请求,把组装好参数和地址,发起请求,等待并处理结果返回就可以。
多媒体
图片
从上传到浏览的处理:获取(单选多选相册、拍照)、多图上传、小图浏览及加载指示、大图放大。下载显示包含异步下载和文件处理等,这些已被SDWebImage集成好。
其他处理包括截图、裁剪、玻化、水印、压缩等。
音频
录音、时长、本地网络播放、上传、下载、权限、后台模式、音频冲突等。本地播放还分文件播放和文字播放的。如果感觉系统的语音不好听,可以引入科大讯飞语音。
视频
视频比音频文件大,多了图像流,所以上传、下载需要压缩、分段或者续传之类的,格式上要和安卓兼容,还要视频转码,视频缩略图有接口直接可以获取到。其他很多和音频类似。
性能优化
这个模块要求有很好的技术,而且贯穿这个开发生涯。
小到编码规范,大到精妙算法,很多都和性能有关。网上已有不少博客描述了性能优化的例子,读者请自行查看,下面说说小编性能优化经历:
内存管理
MRC的内存管理在此就不多说了,下面列出几个ARC下的内存管理:
- c或者底层C写的框架,CoreFoundation,CoreGraphics等,所生成的对象
- 循环引用,对象件引用,代码块相关引用
- 循环生成多个对象时,用autoreleasepool及时释放内存
- 相册、图片处理,读写时防止出现内存峰值
- @property相关的设定
- dealloc释放相关(释放引用或者定时器、移除侦听)
UI渲染
主要是控制圆角、边框、透明度和控件重叠等。显然,频繁重绘肯定影响性能了,比如地图功能里不断移除和添加标注或覆盖物。
降低CPU消耗
在cell重用的时候,尽量不重复生成对象,尤其是NSDateFormatter和NSNumberFormatter。异步加载图片的时候,多个线程也会加大CPU负担。
代码重构
经常因为赶工期,前面往往是实现了功能,后来有时间才会重构代码,优化一些算法的实现,这部分优化性能的多是处理循环相关的操作。
项目管理
工程设置
工程设置内容比较多,经常要改的就是版本号、描述文件和证书了。有时还会因为需求而改变后台模式等功能性设置,其他更改往往得根据编译报错来进行。
文件管理
这块主要是管理工程目录结构。文件归类前,创建的是实际文件夹,加入工程的时候使用参考文件夹,这样可以避免工程错误导致的文件错乱。目录分类规则一般按功能分类,把大模块需求一级级细分。更新较多的是Resources的Images、新需求模块的创建。
版本管理
可以使用SVN、github、git等管理项目版本,git可以是公司的git服务器,也可以用Xcode自带的git工具。它们各有长短,使用的套路基本类似,了解下它们的原理,用哪个都顺手。
架构设计
架构设计考虑最多的就是重用性、维护性和扩展性了。架构开发者把各个模块分类,封装好,其他开发人员直接调用、在相应模块编辑就可以。好的框架往往可以看到很明显的Designated和Secondary接口。小编搭建项目架构的时候,主要做了一下几方面工作:
- 编写预编译头文件
- 加入通用宏定义、类型常量
- 引入需要用到的第三方,包括CocoaPods及非CocoaPods的第三方
- 引入项目通用接口
- 创建MVC基类
- model基类主要实现runtime模型字典转换,runtime归解档
- 各种UIView及其子类的封装
- VC设置返回手势、导航栏、网络加载动画等
- 编写网络接口及处理层级数据结构的接口
- 编写全局工具类、字符串、加密、推送和系统功能工具类等
其他内容根据需求进行增加或者修改。