文章目录
  1. 1. 前言
  2. 2. 过程概述
    1. 2.1. objC
    2. 2.2. 语法入门
    3. 2.3. UI入门
    4. 2.4. 第一份工作
    5. 2.5. 第二份工作
  3. 3. 各模块技术
    1. 3.1. 语法基础
    2. 3.2. UI基础
    3. 3.3. 应用开发
    4. 3.4. 小数据存储
    5. 3.5. 大数据存储
    6. 3.6. 数据处理
    7. 3.7. 网络
    8. 3.8. 多媒体
      1. 3.8.1. 图片
      2. 3.8.2. 音频
      3. 3.8.3. 视频
    9. 3.9. 性能优化
      1. 3.9.1. 内存管理
      2. 3.9.2. UI渲染
      3. 3.9.3. 降低CPU消耗
      4. 3.9.4. 代码重构
    10. 3.10. 项目管理
      1. 3.10.1. 工程设置
      2. 3.10.2. 文件管理
      3. 3.10.3. 版本管理
    11. 3.11. 架构设计
    12. 3.12. 代码调试
  4. 4. 各项目回顾
  5. 5. 优秀第三方SDK原理探究
  6. 6. 高级开发
  7. 7. 技术瓶顶限制
  8. 8. 对iOS开发的看法
  9. 9. 对软件开发工程师的理解
  10. 10. 编程思想
  11. 11. 结语

前言

本文主要是为进阶新层次而总结开发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基类
    1. model基类主要实现runtime模型字典转换,runtime归解档
    2. 各种UIView及其子类的封装
    3. VC设置返回手势、导航栏、网络加载动画等
  • 编写网络接口及处理层级数据结构的接口
  • 编写全局工具类、字符串、加密、推送和系统功能工具类等

其他内容根据需求进行增加或者修改。

代码调试

各项目回顾

优秀第三方SDK原理探究

高级开发

技术瓶顶限制

对iOS开发的看法

对软件开发工程师的理解

编程思想

结语

文章目录
  1. 1. 前言
  2. 2. 过程概述
    1. 2.1. objC
    2. 2.2. 语法入门
    3. 2.3. UI入门
    4. 2.4. 第一份工作
    5. 2.5. 第二份工作
  3. 3. 各模块技术
    1. 3.1. 语法基础
    2. 3.2. UI基础
    3. 3.3. 应用开发
    4. 3.4. 小数据存储
    5. 3.5. 大数据存储
    6. 3.6. 数据处理
    7. 3.7. 网络
    8. 3.8. 多媒体
      1. 3.8.1. 图片
      2. 3.8.2. 音频
      3. 3.8.3. 视频
    9. 3.9. 性能优化
      1. 3.9.1. 内存管理
      2. 3.9.2. UI渲染
      3. 3.9.3. 降低CPU消耗
      4. 3.9.4. 代码重构
    10. 3.10. 项目管理
      1. 3.10.1. 工程设置
      2. 3.10.2. 文件管理
      3. 3.10.3. 版本管理
    11. 3.11. 架构设计
    12. 3.12. 代码调试
  4. 4. 各项目回顾
  5. 5. 优秀第三方SDK原理探究
  6. 6. 高级开发
  7. 7. 技术瓶顶限制
  8. 8. 对iOS开发的看法
  9. 9. 对软件开发工程师的理解
  10. 10. 编程思想
  11. 11. 结语