# 老司机 iOS 周报 #39 | 2018-10-15

![ios-weekly](../assets/ios-weekly.png)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 新闻

### [Swift in 2018](https://www.jetbrains.com/research/devecosystem-2018/swift-objc)

JetBrains 针对 Swift 编程生态做了一个调查。结果显示只使用 Swift 的开发者占比 54%，混编的占 16%。83% 的 Swift 开发者在使用 4.0 或者以上的 Swift 版本。

### [仅 23 天，iOS 12 安装率超过 50% ](https://9to5mac.com/2018/10/06/ios-12-now-installed-on-50-of-devices-outpacing-ios-11/)

iOS 12 推出仅 23 天装机量超过 50%，而 iOS 11 达到这个成绩用了超过一个月。相比 iOS 11 发布后的 bug 满天飞，iOS 12 的改进赢得了用户口碑。

## 文章

### 🐎 [质量监控 - 卡顿检测](https://juejin.im/post/5bb09795f265da0ac84946e0)

卡顿检测是 APM 里体验是否流畅的重要标准，被大家熟知的卡顿检测方式通常是基于主线程是否执行任务过载来进行。这篇文章较为系统地分析了卡顿检测的各种手段及其实际效果和性能损耗，除了借助 Instruments 工具，在代码侧还有 FPS、Ping、Runloop、Stack Backtrace 和 msgSend observe 5 种手段。

### 🐎 [It’s wrappers all the way down](https://oleb.net/2018/lastindex-reversed/)

"Swift 标准库目前的求值策略是：如果一个操作的惰性求值是无需消耗性能的话，那就应该让它成为一个惰性操作。如果惰性求值的实现反而会消耗性能的话，那应该就让它及早求值，如果它有一种等价的 lazy 实现的话，那就应该通过 .lazy 去实现。"

基于这种求值策略，我们在对数组进行一些复杂的操作时，更 Swifty 的方式是考虑如何为这一种操作创建合适的 wrapper。这篇文章带着我们重新实现 `lastIndex(of:)` 函数，为这一种集合操作创建 `ReversedCollection2` 的抽象，并解释 `joined` / `reversed` 之类的集合操作的原理。

### 🐕 [如何实现可以获取最小值的栈？](https://mp.weixin.qq.com/s/tLaRUCEgtQwoFdELZlcsZA)

这是前几周微博上和微信大家争相转发的一篇公众号文章。文章用漫画的形式讲了一道算法题目的解题过程、文中一步一步逐渐深入，逐渐优化，最后得出最优解。

其实在真正的面试过程中，情况也是一样的。面试官很多时候并不希望你能一次就给出最优解，反而是期待你能从最简单的暴力解法开始，一步一步优化出最优解。面试中很多同学一旦遇到了自己曾经准备过的题目，往往会选择直接写出最优解，殊不知很多时候反而会得到一个负面评价，原因是你曾经做过了这道题，但是却没有主动让面试官换一题新的，不够诚实。这种时候，跟着面试官的思路，从暴力解法开始一步一步优化，最后得出最优解，反而更能体现你的解决问题的能力。

没读过这篇文章的同学不妨读读文章，来看看解题应该是个怎么样的思考过程。

### 🐕 [[译] 揭秘 iOS 布局](https://sq.163yun.com/blog/article/200743376636538880)

iOS 的布局系统是每个 iOS 工程师都需要具备的基础知识，我们可能每天都在跟诸如 setNeedsLayout()、updateConstraints() 之类的方法打交道，但是可能并没有形成一个非常系统的认识。本文作者详细讲解了每个方法的作用以及不同方法之间的联系，相信能带给大家一个相对全面的认识，加强对布局原理的理解。


### 🐢 [iOS Memory Deep Dive](https://www.jianshu.com/p/dad9f27e412e)

这是一篇内容非常详实的文章，作者围绕着内存这个话题，从现代计算机操作系统的虚拟内存机制一步步讲到 iOS 的虚拟内存机制，最后给出了在实际开发中一些如何高性能运用内存的建议。

### 🐕 [Access Control Management with Swift](https://medium.com/ios-os-x-development/access-control-management-with-swift-cc3c3d68cbc3)

本文介绍了用户权限管理的抽象方式，构建了一个基于用户属性的访问控制框架（Attribute Based Access Control），利用了 swift 中 protocol 的强大功能，以策略（Policy = Role ShouldBeAbleTo Action when Condition）的形式，对需求进行建模。该框架可以以非常小的变更成本，增加新的策略来维护权限要求，最后产生的判断用户权限的 API 也非常优雅。

### 🐢 [How to Write Clean Code](https://medium.com/quick-code/how-to-write-clean-code-bbcf35ac1aef)
本文是一篇介绍 Code Review 工作流程的文章，从以下四个维度介绍了作者的经验
1. Code Review 的必要性和最佳时间点
2. 如果已经准备提交 Review ，注意代码规模（太多别人看不来，太少看不出端倪）
3. 执行 Code Review
4. Code Review 的例子
总体而言，Code Review 应该是审查代码内容、代码逻辑和安全边界，如果可以的话连测试用例也一起进行 Review，对于代码风格类的东西应该借助 Checkstyle、TSLint、Baseline、Prettier 等工具完成，而 Review 的记录应该保存在一个平台上以供参考，可以使用 Reviewable、Gerrit、GitHub 等工具

### 🐕 🚧 [On Learning to Code (for 2019)](https://medium.com/coderbyte/on-learning-to-code-for-2019-aa086284a218)

通过[谷歌 learn to code 趋势](https://trends.google.com/trends/explore?date=all&geo=US&q=learn%20to%20code,learn%20coding)可以看出从 2012 年开始人们学习编码并成为职业人员的趋势开始有所增长。作者就自己从业 7 年的经验，给大家分享作者认为很重要的三点。
1. 学习的初始编程语言应与您的目标保持一致
2. 计算机科学≠软件工程
3. 技术面试并不是完美的


## 工具

### [JSDebugger 一款iOS的动态调试器 ](https://github.com/SatanWoo/JSDebugger)

一款可以动态在 iOS 中执行调试代码的工具，原理是利用 JavascriptCore 与强大的 iOS Runtime 还有很多其他的 dynamic call 方式来结合形成的一套可以动态调试 iOS app 的工具。工具内的代码堪称对 JSCore 还有 iOS Runtime 学习的样本，值得一看，值得一学

### [Sizes](https://github.com/marcosgriselli/Sizes)

Sizes 这款工具可以根据不同 iPhone/iPad 设备及尺寸规格、横竖屏、字体预览界面显示效果，省去同时打开很多模拟器并来回切换的麻烦，提高布局测试的效率。

## 代码

### [smoke-framework](https://github.com/amzn/smoke-framework?utm_source=gold_browser_extension)

SwiftNIO 的推出被视作 APPLE 终于肯“认真对待” server-side swift 的标志。目前各大 swift 服务端框架都纷纷接入了 SwiftNIO 的支持。简单的总结 SwiftNIO 就是：很强。

smoke-framwork 是 Amazon 推出的 server-side swift 的框架，默认使用 SwiftNIO 来做网络层，并且支持 OpenAPI 这样的代码自动生成工具。Amazon 作为行业主要是云服务提供商，这个发布是极具指导意义的，代表 swift 真正被服务端市场所接纳、认可。虽然目前针对 smoke-framework 的评测还不多，但基本可以确定的是该框架会和 Amazon 的 AWS 生态有较好的融合，这对于绝大多数公司而言绝对是利好。

还等什么呢，学就 vans 了。

> 推荐人：[LeeCenY](https://github.com/LeeCenY)

### [Logan](https://github.com/Meituan-Dianping/Logan)

对于一个 App 来讲，日志的收集、上报、查询是非常重要的。而目前在各个公司中，对日志的处理大多并没有形成一套完整的体系，都是针对不同的日志类型，如crash、性能、打点等等进行单独的处理。近日，美团点评开源了移动端基础日志库 Logan ，Logan 是一个功能完善、无侵入的日志框架，解决了很多移动端日志方面的痛点，并且拥有较好的性能，可以很方便的接入。

## 音视频

### [NSSpain](https://vimeo.com/nsspain)

一份来自西班牙 Cocoa 开发者的视频合集，最近一篇就来自 Mattt 大神，同时，作为英语听力材料也是很棒的说。

### 🚧 [SwiftConf '18](https://www.youtube.com/playlist?list=PLgUjQUYKwG_hkD2ZcfAs7bTZwbEtAnNFs)

Swift Conf 是欧洲技术爱好者组织的 Swift 大会，今年大会的主题演讲视频在大会完成之后立刻放了出来，里面包括一些今年比较火的主题，例如机器学习，ARKit，Swift ABI 稳定，Swift 服务端开发等，有兴趣的同学可以看一下。

## 内推

- [北京-百度网盘 持续招 iOS 开发](https://talent.baidu.com/external/baidu/index.html#/jobDetail/2/102507)：社招、应届、实习均可。项目在技术上很有挑战性，团队技术氛围极好。诚心希望各路大神前来切磋，也欢迎计算机基础好的小白来共同学习。简历发邮箱 xuyafei01@baidu.com，暂不考虑的也欢迎微博私信 [@小非86](https://weibo.com/xuyafei86) 聊聊~

- [北京-蚂蚁金服 招iOS/安卓/前端开发](https://job.alibaba.com/zhaopin/position_detail.htm?trace=qrcode_share&positionCode=GP031268&from=timeline&isappinstalled=0)：负责支付宝会员及帐号业务线，地点北京国贸，金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到：weijing.wdf@alibaba-inc.com / weijing.wdf@antfin.com （同一个邮箱）或者微博私信 [@折腾范儿_味精](https://weibo.com/agvicking) 了解情况。

- 上海即刻：如果你认识聪明勤奋、胆大心细、有追求的工程师，那就来加入我们吧！任何推荐或简历可直接发给 Jason（即刻 iOS leader）: jasy@okjike.com，或微博 [@JasonYuh](https://weibo.com/jasonyuh)。

- [杭州奇志科技招聘 iOS、前端](https://www.lagou.com/gongsi/34872.html)：奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域， 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 [@没故事的卓同学](https://weibo.com/u/1926303682) 了解。

- [深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目](https://job.toutiao.com/2018/spring_referral/?token=alPR8WCv8nnnc5QqtsyKjw%3D%3D&key=MTY1MDMsMTg0MTQsMjA1MjAsMTk1NjEsMTU2ODksMTc0ODk%3D)：如想了解更多深圳头条的信息，可以加小T微信：tomtan，切磋技术和聊情怀都可以喔~~~~

- [北京字节跳动 iOS 团队持续招人中](https://job.toutiao.com/society)：简历可以发送到邮箱 raozhizhen@gmail.com，或者添加我（[@AidenRao](https://weibo.com/AidenRao)）的微信 jingmu1994 了解更多公司及岗位信息。

- [北京百度教育事业部招 iOS 开发](https://www.baidu.com/s?wd=百度)：百度教育事业部，地点：北京西二旗。部门下面有百度阅读，百度文库，百度爱听等 App 产品。团队技术氛围浓厚，有兴趣的同学欢迎将简历发送到我的邮箱：lizelei@baidu.com。

## 关注我们

我们开通了公众号，每期发布时公众号会推送消息，欢迎关注。

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

同时也支持了 RSS 订阅：https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

## 本期编辑

[@没故事的卓同学](https://weibo.com/1926303682/profile)，[@四娘](https://kemchenj.github.io)，[@享耳先森](https://github.com/iblacksun)，[@Damonwong](https://weibo.com/damonone)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@AidenRao](https://weibo.com/AidenRao)，[@Parsifal](https://weibo.com/parsifalchang)，[@aaaron7](https://weibo.com/aaaron7)，[@方秋枋](https://weibo.com/100mango)，[kyo](https://github.com/KyoLi)，[tom510230](https://xiaozhuanlan.com/u/6682065345)，[anotheren](https://anotheren.com)，[水水](https://www.xuyanlan.com)，[looping](https://github.com/looping)，[@JasonYuh](https://weibo.com/jasonyuh)，[@老老老老老老老驴](https://weibo.com/u/6090610445)，[@小非86](https://weibo.com/xuyafei86)

## 说明

🚧 表示需翻墙，🌟 表示编辑推荐

预计阅读时间：🐎 很快就能读完（1 - 10 mins）；🐕 中等 （10 - 20 mins）；🐢 慢（20+ mins）
