上周戴铭老师出了新书「跟戴铭学 iOS 编程:理顺核心知识点」。作为戴老师的铁杆“技术粉”,我也第一时间下单购买了一本来学习。
这篇文章是我大致浏览前两章内容的一些阅读感受和简单的笔记整理。通过这一次的巩固学习(目前读者已经阅读了第一章及第二章前半部分,但在精读之前已经梳理了这本书涉及到的一些关键知识点),可以查漏补缺,让个人知识体系更加完备。
书籍的知识体系总览
以下是我梳理出的思维导图(这是我的阅读习惯,先大致梳理出书中内容点),右边附加的批注是所属知识体系,这里先分享给大家。

如果你觉得最右侧的知识体系你有很多不了解的,那这本书绝对是一个不错的选择。当然前提是,你要认真的读!
抓住 Swift 的命脉,逐渐深入底层,展望大前端未来
纵观近两年 iOS 行业发展,Swift 趋势愈发明显。在一线互联网公司中,基本上新项目无不例外的都会选型 Swift 这门语言进行 iOS App 的开发。据我所知,字节跳动新推出的几个产品飞书、剪映等已经全面拥抱 Swift。这其实也就是戴铭老师要用 Swift 基础知识来开篇的理由。

以下是戴铭老师写这本书前言摘录,我提炼出几点给大家看看:
对于个人来说,当你要从普通开发者往架构设计师这条路上走,除了满足用户功能需求的开发,还需要了解更多的技术选型,才能为团队开发效率和质量提供支持和保障。这不光是凭借经验就能做到的,还需要对编程语言和编程范式有更多的了解。
对语言编译过程的学习,价值是很高的。你可以回想一下,当碰到一个以前没有做过的需求,解决一个没有碰到过的线上问题时,处理的方案肯定是有高低之分的,了解的越多越深入,方案就更有效 …… 对编译产物结构进行了解,不光能逆向看竞品,还能了解和处理很多其他事情。这些知识不易过时也具有通用性。计算机底层不断演进,系统不断趋同,特别是数据结构的设计就有很多值得学习和借鉴的。
对于跨端技术来说,学习会让你疲惫,即使你已经掌握了怎么使用,开发了很多功能,踩过无数坑,当你面对下一个流行框架时,可能又要重新来过 …… 一个合格的架构师,需要具有的是看清技术本质和趋势的能力,而了解这些技术的本质是了解隐藏在这些跨端技术背后的实现。

作为一个硬核号主,怎么能发纯软文呢?????下面来说一些好玩的知识点吧!
记录一些好玩的知识点
Reference Type Matters 和派发机制(21页)
在书中有讲到 Swift 的方法派发方案,如果你还没有阅读的话,你可以先看看下面这段代码会输出什么结果?
protocol MyProtocol {}
struct MyStruct: MyProtocol {}
extension MyStruct {
func extensionMethod() {
print("MyStruct - extension")
}
}
extension MyProtocol {
func extensionMethod() {
print("MyProtocol - extension")
}
}
let myStruct = MyStruct()
let proto: MyProtocol = myStruct
myStruct.extensionMethod() // MyStruct - extension
proto.extensionMethod() // MyProtocol - extension
可能看着这个结果你会十分疑惑,为什么同是 MyStruct
对象,调用的方法却不同呢?不应该是都输出 MyStruct - extension
吗?其实不是这样的,因为 extensionMethod
方法并没有在 MyProtocol
声明,而是通过 MyProtocol
的 extension
直接实现的,如此对于 extensionMethod
方法在 myStruct
和 proto
就造成了派发差异。根据 Swift 中引用的类型决定了派发方式的原则(Reference Type Matters),就会查询到不同的实现方法。
那如果我们在 MyProtocol
预先声明一下这个方法呢?例如修改上述代码为:
protocol MyProtocol {
func extensionMethod()
}
struct MyStruct: MyProtocol {}
extension MyStruct {
func extensionMethod() {
print("MyStruct - extension")
}
}
extension MyProtocol {
func extensionMethod() {
print("MyProtocol - extension")
}
}
let myStruct = MyStruct()
let proto: MyProtocol = myStruct
myStruct.extensionMethod() // MyStruct - extension
proto.extensionMethod() // MyStruct - extension
是的,声明之后其实就有着 override
的效果了,因为全部走了表派发。
当你阅读到 P21 页中的 1.6.2 Swift 派发机制 这个小结,并能总结出上述结论,那么我觉得你在开发中会避免很多”坑“。
Clang Static Analyzer 怎么去玩 (109页)
在 2.4 clang static analyzer
章节中,介绍了关于 clang static analyzer
的一些知识,其中你可以通过命令 clang -cc1-analyzer-checker-help
来获取内置的所有常用 checker 来对代码进行静态检测。

可能你经常处于上层开发状态,对于这个东西完全没有概念。其实用简单的话来讲,就是通过词法分析(Lexical Analysis),在语言层面来进行分析查看。我举一个编程可能会遇到的问题——除零问题。我们发现内置的 checker 中有一个 core.DivideZero
的 checker,我们来使用他进行单文件的检测。
// main.m
void divide(int a, int b) {
int c = a / b;
}
int main(int argc, char * argv[]) {
divide(1, 0);
}
我们保存成 main.m
的 ObjC 文件,然后使用命令:
$ clang -cc1 -analyze -analyzer-checker=core.DivideZero main.m
main.m:11:15: warning: Division by zero
int c = a / b;
~~^~~
1 warning generated.
此时我们发现,通过这个 checker,已经对这种除零问题作出了预警,此时他提示我们应该去修改这部分的内容。
当然类似的例子还有很多,笔者目前只阅读了不到一半,等全部阅读完,也会和大家一起探究各个有趣知识点的延伸。
一瓜 iOS 进阶交流群
独立于算法群,只专注 iOS 基础研究。在读书和学习时遇到困难也可以在群内及时交流。

公众号福利抽奖
抽奖方式:
第一步:点击本文标题下方 “让技术一瓜共食”
第二步:如果未关注公号,关注后点击 “进入公众号”
第三步:将最下方的菜单切换成输入框
第四步:在输入框中输入 "抽奖",然后扫码即可
开奖时间为 4 月 19 日下午 18:00 ,开奖后还请中奖的小伙伴填写好收获信息,方便我将奖品发出。
本次抽奖全部由本公众号号主自费,感谢 @戴铭 老师为我提供的签名版本图书。