001-知识体系|建立自己的iOS知识体系

[TOC]

通篇内容

前言

我们从互联网时代走来,迎来了移动互联网,物联网时代,而时代的下一个风口,也许正打得火热的人工智能,也许是......

当下,小程序深得广大用户喜爱、时代正在呼唤AI的凶猛发展,手机终端直播app的风头刚刚过去, 短视频应用正受宠......

而在计算机分支领域这么多的选择里,依然选择了iOS开发的朋友们,也许你是已经从事iOS开发多年的老鸟,你可能仍然会觉得摸不清自己进阶的方向;亦或是,你正在入门路上的新手朋友,正在烦恼如何又快又扎实的掌握iOS研发知识,Hold住你的工作;或者说,你已经熟练掌握一门编程技术,正在扩展自己的技术栈,正在寻找快速掌握iOS只是的窍门......

朋友,无论你是属于上述几种情况的哪一种,相信这篇文章都能帮助到你。

无论是哪一个计算机分支领域都有其庞大的知识体系,这就好像是一座座高峰。从事移动研发7年之久,我已经在移动大前端架构师多年,这几年带项目组过程中,常常发现身边的开发同学们常常为提升自己的技术寻找方向感到困惑,刚毕业的应届生有着、从业几年的朋友有着、跨端扩展自己技术栈的朋友也有......在多次线下分享之后,于是有了今天的开始的第一步,我决定进行专题总结分享。

借此机会系统梳理相关的知识,既是进行一次阶段性总结,同时也希望今天这篇文章能够助更多朋友攀缘更精彩的编程世界。

一、学习方式和核心知识体系

考虑到有机会阅读到这篇文章的朋友们,肯定是技术修养不相同的,于是我先针对不同情况的朋友从学习方式展开本次的分享

1.学习方式|针对不同的开发者

互联网时代,学习资料真的是非常完备。比如,GitHub 上各领域的 Awesome 系列,就是专门用来搜集各类资料的。其中 iOS的Awesome里面,就涉及了 iOS 开发的各个方面。

①对于在校生

我推荐斯坦福大学在 iTunes U 上的 App 开发课程,网上还有同步的中文字幕项目

这个课程中包含了开发一个 App 需要的、最基础的知识。 课程内容

  • MVC 架构、iOS 开发语言基础知识
  • ViewController 的生命周期、整个 App 生命周期、Auto Layout、
  • Storyboards、Scroll View、TableView、Collection View、Text Field
  • 拖拽、多点触摸、动画、持续化存储、多线程、弹窗、通知、、Core Motion、摄像等内容。

这个课程学完,动手开发几个简单 App 上线是没什么问题的。但是,因为真实工作中光靠这些知识是远远不够的,甚至光靠这些知识连面试都过不了。

基于类似这样简单应用层面的知识,掌握斯坦福的这个课程就可以了,不要一味地贪多,后面还有更多值得深入学习的知识在等着我们。

而且,应用层面的基础知识根据实际工作需要再去学习也不迟。

②对于刚参加工作的应届生
  1. 不推荐斯坦福的这个课程了

    • 不是说不适用,而是对于应届生来说,可能一上来手头就会有开发任务,怎么能够快速地上手完成任务才是最重要的;
    • 因为,公司是不会等到你掌握好了各种开发知识以后,才让你开始工作的;
    • 而且,不同公司的产品使用的技术侧重点也会有很大差异,也等不到你掌握好各种开发知识后才让你开始工作;
    • 对于这个阶段的 iOS 开发者来说,如何快速上手完成任务才是最重要的!
  2. 工作中碰到iOS不清楚的知识找苹果官方手册

    • 针对应届生,推荐苹果官方 iOS 开发指南,内容不多但能够帮初学者快速掌握开发思路:
      • 实际工作中碰到所需要的知识,首先翻看官方开发手册,先在这里面找解决方法;
      • 官方代码示例都很规范,分类也很清晰,内容也更全;
      • 从大块上,可以分为 App Frameworks、图形、App 服务、媒体、开发工具、系统等;
      • App Frameworks:App Frameworks里面主要是这类文档资料:
        • Foundation 框架;
        • UIKit;
        • AppKit;
      • 图形分类:图形分类里包含了 UIkit 更底层的内容:
        • Core Graphics;
        • Core Image;
        • Core Animation;
        • 还有 ARKit、Metal、GameKit、SpriteKit 等也在这里面;
      • App服务:App服务里是苹果公司为开发者提供的服务套件,比如:
        • 推送套件 PushKit;
        • 富文本套件 Core Text;
        • 方便集成机器学习模型到我们App 的 Core ML;
        • 车载应用的 CarPlay 等;
        • JavaScript 引擎 JavaScriptCore 在 iOS 中应用接口的资料,我们也可以在这个分类里找到;
      • 媒体:媒体里主要包含了一些音视频的内容:
        • AVFoundation;
        • Core Audio Kit;
        • Core Media;
      • 开发工具:开发工具里有:
        • Swift Playgrounds;
        • XcodeKit;
        • XCTest;
      • 系统:系统这个分类里的内容非常多而且实用:
        • 有网络基础 CFNetwork 和 Network
        • 多核队列相关的 Dispatch
        • 内核框架 Kernel
        • 运行时库 Objective-C Runtime
        • 安全 Security;
    • 这份开发手册内容大而全,没必要在开始时就什么都学;
    • 不然耗费大量精力学到的东西却一时难以用上,会导致我们的职业道路走得过慢;
    • 用时再看即可,只要我们记得,工作中碰到 iOS 不清楚的知识,先到这里来找就对了
③对于已经有多年其他领域开发经验的开发者来说
  • 通过几个示例代码,或者看看已有项目中的代码就能够快速上手了;
  • 其实,iOS开发中的 Objective-C 语言实际上就是 C 语言的一个超集,有 C 和 C++ 基础和经验的开发者转行过来是很容易的,在开发思想上也有很多可以互相借鉴的地方;
  • 而 Swift 语言也融入了很多新语言的特性,比如闭包、多返回值、泛型、扩展、协议的结构体、函数编程模式等,同学们再学起来时也会有似曾相识的感觉;
  • 推荐到 RayWenderlich网站里翻翻它们的教程
    • 这里的每一个教程都会详细指导你如何一步一步去实际完成一个项目,来达到掌握一个知识点的目的;
    • RayWenderlich 里也有很详细的分类,你可以根据实际工作需要来学习;
  • 我的建议同样是,这里知识虽好,但不要贪多;
④有一定 iOS 实际开发经验的开发者

在多年前唐巧写了篇博客“iOS 开发如何提高”、limboy 写了篇“自学 iOS 开发的一些经验”,里面提到的这些提高自己开发能力的方法,拿到今天依然适用。不过,学习终究是需要实践来验证的

『iOS最佳实践』与『实战基础知识手册』

  1. 在进入实战阶段之前,为了避免少走弯路,我们需要一份 iOS 最佳实践

    • 从 IDE 搭建工程最佳使用方式
    • 基础库选择、架构选择、存储方式、资源管理
    • 完整的 App 开发生命周期
    • 代码规范、安全、静态分析、崩溃分析
    • 构建,到部署,甚至是 IAP(In-App Purchases 应用内支付)
    • .....
  2. 实战过程中手册是最常用的,特别是 Swift 语言特性非常多,在还没能达到熟练的情况下,手册往往能够起到查漏补缺的效果

    • Swift 语言的手册就在它的官网,我们可以点击这个链接查看;中文版手册,现在是由 SwiftGG 在维护,目前已经同步更新到了 Swift5
    • 如果想及时获得 Swift 的最新消息,可以订阅 Swift 官网的博客

在实践中积累

  1. 基础知识不要贪多,但对于工作实践中涉及到的领域相关知识,我的建议是一定要贪多,而且越多越好

    • 在实践中多多积累工作中涉及的相关知识,这种学习方法特别适合有了几年工作经验的开发者。
    • 此外,你还要时刻关注和你工作内容相关的领域知识的发展动向,并全面掌握,从而达到由量变到质变的效果,最终达到领域专家的水平
    • 平时持续关注
    • 工作过后及时总结,多多和他人交流
    • Case
      • 举个例子吧。有一段时间,我的工作是和 App 性能相关的。这段时间,我会首先在网上收集一些其他公司在性能上做的事情,然后针对那些事情再去学习相关知识,平时还会通过订阅一些博客和技术团队的输出,持续关注性能这个领域。
      • 等工作上做出了些成绩以后,我就会及时进行整理和总结。在这个过程中,再进行一些思考,多问问自己为什么这么做,还有没有更好的做法。最后再输出,看看其他人和团队的意见和建议。通过交流相互成长,独乐乐不如众乐乐,何乐而不为呢。
  2. 对于学习和积累什么样的知识,我们一定要怀着一颗饥渴的心,查找资料时永远不要觉得够了

    • 查到了很多资料后要多总结、多思考,这样才会有新的思路、新的方案出来。如果问你细心观察 iOS 技术这几年的发展,就会发现很多方案刚开始都很简单,但是随着对底层的研究和思考后会出现更多更优解
    • 以内存监控方案为例。这个方案一开始是到 JetsamEvent 日志里找到那些由内存引起的系统强杀日志来做监控的,但是很难精确定位到问题
    • 后来,随着 fishhook 这种可以 Hook 系统 c 方法的库浮出水面,最终将其引入到了获取内存上限值的方案里。引入 fishhook 后的原理是,先找到分配内存都会执行的 c 函数 malloc_logger,然后使用 fishhook 去截获,并记录到日志里,从而可以精确分析出内存过大的那个对象是在哪里分配的内存
  3. 殊途同归,深挖知识

    • 在基础知识掌握到一定程度、领域知识积累到一定程度后,我们需要再继续深挖知识,也就是众多计算机细分领域中的通用底层知识
    • 在我看来,底层知识是最值得深挖的,不管哪个领域,殊途同归,底层都是需要持续学习的;
    • 这里我推荐 Michael Ash 的“The Complete Friday Q&A”。这本书里面涉及的内容,都是对一些知识点更深一层的探究,会让我们了解更多内存、性能和系统内部的原理,帮我们理解那些万变不离其宗的核心知识。
    • 关于苹果开发,可以先聚焦于「系统内核 XNU、AOP、内存管理和编译」
  4. 当你 iOS 基础打牢了,也积累了很多实践经验,工作上也取得了一定成绩,那你也就成长为一名 iOS 开发老手了

    • 这个时候,我们可以选择一个方向持续地深入学习。
    • 在我看来,最好的深入学习方式就是从头开始实现一个技术雏型
    • 如果你想对 LLVM 编译器能够有更加深刻的理解,那就去实现一个简单的编译器或解释器。比如,这个最小的 C 编译器 OTCC(Obfuscated Tiny C Compiler)就是一个很好的实践
    • 如果想更多地了解数据库的原理,除了看已有数据库的源码外,还可以自己动手开发一个简单的数据库项目。这里有个教程“Let’s Build a Simple Database”,可以一步步地教你如何开发一个简单的数据库。我们可以照着这个教程,动手做起来
    • 甚至是,如果想更多地了解操作系统,也可以学着从头创建一个。这样做,可以帮助你更深刻地理解分页、信号量、内存管理等知识。这里有个非常好的教程叫作“os-tutorial”,我们可以跟着动手做起来,去学习怎么开发一个麻雀虽小五脏俱全的操作系统,包括系统启动、中断处理、屏幕输出键盘输入、basic libc、内存管理、文件存储系统、简单的 shell、用户模式、文本编辑器、多进程和调度等
    • 对于 iOS 老手来说,你能够使用已经掌握的技术栈,触类旁通地去接触其他领域来拓宽自己的技术视野。以服务端开发为例,使用 Perfect就能够用 Swift 语言来做服务器的开发
      • Perfect 是由加拿大一个团队开发并维护的,这个团队的成员对技术都很有热情,热衷于用优秀的技术去做优秀的事情。所以,Perfect 不仅功能丰富,而且紧跟最新技术的发展,对 TensorFlow、NIO、MySQL、MongoDB、Ubuntu、Redis 的支持做的都很到位

针对不同积累情况的朋友,分享完学习方式,紧接着针对学习理念的分享展开

2.学习理念|锚定一点,进行深耕

知识掌握的牢固、精细程度,不是根据学习资料收集的多少来衡量,而且人的精力是有限的,根本无法 完全掌握这些被轻松收集来的资料。 从我所接触过的那些混迹编程界的“大牛们”,他们也不是样样精通,而是有自己擅长的领域。

他们分享自己的成长经历,几乎都是先深挖某一领域,经过大量的学习和实践后理解了编程的本质, 从而可以灵活调配和运用自己已经积累的知识。 在这之后,他们再探索其他领域时,就做到了既快又深,成了我们眼中的“大神”。

所以,我们作为开发者在进行知识点学习时,要有所选择的学习:

  1. 对于尚未入门的开发者:先把必要的核心知识点吃透,再围绕目前开发应用的需要,逐个吸收知识点 并应用。快速入门;
  2. 对于已经iOS入门成功,正在进阶的开发者:要学会锚定一点,进行深耕,逐步成为该方向领域的大牛。

总而言之,学习 iOS 开发这件事儿,不要一开始就求多,而要求精、求深。因为,条条大路通罗马,计算 机的细分领域虽然多,但学到底层都是一样的。

不要被新技术牵着鼻子走,而是努力提升自己的内功,这样才能得心应手地应对层出不穷的各种新技术 要形成核心且重要的「iOS开发知识体系」。

这些知识,不仅有助于我们平时的开发工作,能够提高我们开发App 的质量和效率,还能够引导我们开发 者朋友将各类知识贯穿起来,进而形成一套自己的核心且有深度的知识体系

举个例子:

  • iOS 动态化和静态分析技术里有大量与编译相关的知识。编译作为计算机学科的基础知识,除了

  • iOS 开发,在跨端技术 Weex、React Native,甚至前端领域(比如 Babel)都被广泛使用

  • 不要 急着看到啥就去学啥,有目的、有体系地去学习,效果才会更好。

终于,说完了学习方式、学习理念,来到今天这篇文章的重点篇幅----搭建核心知识体系

3.iOS核心知识体系

我认为,好的知识体系首先需要能起到指导 iOS 应用的开发 和 发现并解决开发问题的作用。 所以在我划分的 iOS核心知识体系,包括了「基础、原理、应用开发、原生与前端」四大模块。

设置四大模块的设置初衷:

  • 【基础模块】:基础模块的作用,就是让开发者具有基本的发现并解决开发问题的能力;
  • 【应用开发模块】:应用开发模块,就是用来指导应用开发的;
  • 【原理模块】&&【原生与前端模块】:
    • 好的知识体系还要能够应对未来变革,也就是需要打好底子掌握原理、理清规律,看清方向。

    • 所以,原理模块的作用就是帮你掌握原理和理清规律,而原生与前端模块会助你看清方向。

二、 iOS知识体系

介绍知识体系的过程,既囊括核心知识体系的部分,也针对iOS系统的四层插入了一些库的简介以便后期进行拓展。 首先来一张图,进行一个概览:

1.基础

①开发阶段
  • 启动流程
    • 启动的快慢,可谓 App 的门面,同时关乎日常的使用体验,其重要性不言而喻
    • 只有了解了 App 的启动流程,才能合理安排启动阶段对功能初始化的节奏,将启动速度优化到极致
  • 界面布局
    • 界面是开发 App 的必经之路,是一定绕不开的
    • 如何提高界面开发的质量和效率,一直是各大团队研究的重要课题
  • 架构设计
    • 架构怎么设计才是合理的,也是这个阶段需要探索的一个重要课题
    • 每个团队的情况不一样,什么样的架构能够适应团队的长期发展?
②调试测试阶段
  • 提速调试
    • iOS 开发的代码都是需要编译的。那么,程序体量大了后,编译调试过程必然会变长。
    • 而有什么方法能够将这个过程的速度提高到极限?
  • 静态分析
    • 对 App 质量的检查,分为人工检查和自动检查。而质量检查的自动化肯定是趋势
③发布阶段
  • 自动埋点
    • 埋点的重要性
      • 发布前需要加上各种埋点,这样才能让我们充分地掌握 App 运行状态是否健康
      • 同时埋点也是分析上线后遇到的各种问题的重要手段
    • 无侵入埋点
      • 如果埋点的代码写的到处都是,修改和维护时就会举步维艰
      • 要掌握一些好的将埋点和业务代码解耦的无侵入埋点方案
  • 体积优化
    • iOS 安装包过大会导致 4G 环境下无法下载的情况
    • 所以对包大小的控制已经成为各大公司最头疼的事情之一,所以要去掌握包大小瘦身
④上线阶段

开发质量的高低会影响上线后问题的数量和严重程度,比如有崩溃和卡顿这样导致 App 不可用的问题,也有性能和电量这样影响用户体验的问题。了解这些方面显得尤为重要:

  • 崩溃监控

  • 卡顿监控

  • 日志收集

  • 性能监控

  • 多线程问题

  • 电量问题

2.应用开发

①关注经典库

应用开发部分,我们需要关注的就是一些经典库。比如:动画库 Pop,响应式框架 RAC、RxSwift,JSON 处理库 JSONModel、Mantle 等。因为这些经典库往往出自技术大拿之手,代码结构和设计思想都非常优秀 同时经过了大规模的实践,不断打磨完善,具有很高的质量保障

应用开发中和视觉表现相关:

  • GUI 框架、动画、布局框架

  • 富文本布局框架新贵 Cartography

  • 富文本霸王 YYText 、DTCoreText

  • 响应式框架、TDD/BDD

  • 编码规范等知识能够让我们的开发更规范化、更有效率

    我们可以从「实践应用」和「实现原理」的方面,全方位地去了解如何更好地进行应用开发

②GUI框架
  • UIKit
  • Core Animation
  • Core Graphics
  • Core Image
  • OpenGl ES
③响应式框架
  • Reactive Cocoa
  • RxSwift
  • EasyReact
④动画
  • Pop
  • RZTransitions
⑤A/B方案
⑥消息总线
  • PromiseKit
  • SwiftTask
⑦JSON处理
  • JSONModel
  • Mantle
  • JSONDecoder
⑧布局框架
  • Masonry
  • SnapKit
  • Cartography
  • Yoga
⑨富文本
  • YYText
  • DTCore Text
⑩TDD、BDD
其他
  • ①编码规范

3.原理

①iOS原理

说到 iOS 开发原理,主要就是系统内核 XNU、AOP、内存管理和编译的知识。这些知识具有很强的通用性,其他任何语言、系统和领域都会涉及到。 掌握原理的意义:

  • 掌握这些通用知识,可以提升我们的编程内功,打通任督二脉;
  • 深挖知识,可以帮你理清楚开发知识的规律,达到融会贯通的效果;
  • 掌握通用知识,也能够让你对未来技术见招拆招。
②系统内核XNU
③AOP
  • Runtime Method Swizzling
  • libffi
④内存管理
⑤编译

4.原生与前端

关于原生与前端,我们无法选择的时候就都选择!

随着 Flutter 和 React Native 越来越完善,关注这一块的朋友也越来越多。 原生还是前端,才是移动应用的未来,谁都没法说得清楚。有句话怎么说来着,无法选择时那就都选择。

在原生与前端这个部分,我们会着重关注隐藏在这些时髦技术背后的「解释器」和「渲染技术」,也正是这些技术的演进造就了目前跨端方案的繁荣。

①H5与Flutter
  • 从 H5 到 Flutter,渲染底层图形库都使用的是 Skia
  • 向 Flutter 的演进也只是去掉了 H5 对低版本标准的支持。
  • 但,仅仅是去掉这些兼容代码,就使性能提升了数倍
②JavaScriptCore
③跨端方案
  • Reactive Native
  • Weex
  • Flutter
  • H5
④布局区别
  • 原生布局
  • 前端布局
⑤渲染区别
  • 原生渲染
  • Reac Native渲染
  • Flutter 渲染
⑥动态化方案分析
  • WaxPatch
  • JSPatch
  • OCS
  • 低风险方案

5.系统库

①CocoaTouch

②MediaLayer

图层处理
音频
视频
音视频传输
其他媒体库

③CoreServices

  • Foundation
  • Core Location
  • Push Kit
    • PushKit类似于APNS的静默推送,但是在送达率上比静默推送可靠的多,用户是可以没有任何感知的。
    • PushKit是一种新的消息通知方式,旨在帮助voip应用(iOS 8)和watch OSComplication(iOS 9)减少电池的使用,提供更好的用户体验
    • app可以通过PushKit进行唤醒,进行一些操作,而不被用户感知
    • PushKit官网介绍
  • Core Data
    • Core Data提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中;
    • Core Data也能够将保存在数据库中的数据还原成OC对象;
    • Core Data官网介绍
  • JavaScriptCore
    • JavaScriptCore框架 是一个苹果在iOS7引入的框架;
    • JavaScriptCore框架让 Objective-C 和 JavaScript 代码直接的交互变得更加的简单方便.
    • JavaScriptCore官网介绍
  • Address Book
  • Core Foundation
  • EventKit
  • MobileCoreServices
    • 定义系统支持的统一类型标识符(UTIs)
  • WebKit
    • WebKit 是一个开源的浏览器引擎;
    • 同时WebKit 也是苹果Mac OS X 系统引擎框架版本的名称,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X 程序;
    • WebKit官网介绍
  • Multipeer Connectivity
    • Multipeer connectivity是一个使附近设备通过Wi-Fi网络、P2P Wi-Fi以及蓝牙个人局域网进行通信的框架;
    • 互相链接的节点可以安全地传递信息、流或是其他文件资源,而不用通过网络服务;
    • Multipeer Connectivity官网介绍
  • CFNetwork
  • Core Media
  • HealthKit
    • HealthKit 框架提供了一个结构,应用可以使用它来分享健康和健身数据;
    • HealthKit官网介绍
  • NewsStandKit
  • StoreKit
  • CloudKit
  • Core Motion
  • PassKit
    • Wallet 的前身叫 Passbook,它是一个票据凭证的综合管理中心,用户可以把登机牌、电影票、优惠券等所有凭证添加到 Wallet
    • 在里面可以查看凭证的相关信息,使用时直接通过 Wallet 就能看到你所有的票据和凭证
    • PassKit官网介绍
  • HomeKit
    • 苹果Homekit智能家居平台是智慧家庭控制中心,让用户能够通过一个应用对所有智能家居类硬件产品进行统一管理
    • HomeKit管网介绍
  • System Configuration
  • Core Telephony

④CoreOS

三、总结

1.学习方式&&学习资料

  • 学习方式、学习资料
  • 选择性学习
  • iOS核心知识体系
  1. 工作中碰到iOS不清楚的知识找苹果官方手册
  2. 对于已经有多年其他领域开发经验的开发者来说
  3. 『iOS最佳实践』与『实战基础知识手册』
  4. 在实践中积累
    • 相关基础知识要持续积累
    • 相关底层知识,要深挖
    • 为了更好理解具体的知识点,需要去阅读学习相关的科班资料,甚至去动手实践 比如编译链

2.学习理念:锚定一点进行深耕

选择性: 有目的、有体系地去学习,效果才会更好

3.iOS核心知识体系

  • 学习方式、学习资料
  • 选择性学习
  • iOS核心知识体系

4.苹果开发系统库

推荐阅读:

后记

欢迎编程江湖的各路朋友阅览与点评我的博客,若您觉得我的这篇文章对你的工作有所帮助,我深感欣慰。您也可以动一动小手,将它分享到其它iOS开发者面前,衷心希望更多的朋友一起来促进这伟大社区的发展,一起让这编程世界更加磅礴隽永。

我将会在未来投入更多精力继续为朋友们争取输出优质文章,也欢迎你关注我,非常感谢!!

与此同时,也非常欢迎朋友们前来与我进行iOS相关知识的讨论, 这是我的联系方式:QQ 1101819159

[TOC]

猜你喜欢

转载自juejin.im/post/6992131446693429255