老司機 iOS 週報 #110 | 2020.04.20

老司機iOS週報發表於2020-04-20

ios-weekly
老司機 iOS 週報,只為你呈現有價值的資訊。

你也可以為這個專案出一份力,如果發現有價值的資訊、文章、工具等可以到 Issues 裡提給我們,我們會盡快處理。記得寫上推薦的理由哦。有建議和意見也歡迎到 Issues 提出。

新聞

GitHub is now free for teams - The GitHub Blog

GitHub CEO Nat Friedman 宣佈已面向全體 GitHub 使用者和團隊提供不限制協作人數的私有倉庫,並宣稱 GitHub 的全部核心功能現已對所有人免費提供。

去年 GitHub 宣佈私有倉庫免費,同時提供 3 個免費協作人數的名額,如果需要更多的協作人數,則需要付費。但從現在開始,任何團隊都可以免費使用不限制協作人數的私有倉庫。

新手推薦

? 為什麼使用匯編可以 Hook objc_msgSend(上)- 彙編基礎

@J_Knight_:本文講解了 ARM64 的彙編基礎知識,其中包括:

  • iOS 的記憶體分割槽及棧區;
  • ARM64 中的暫存器及其含義;
  • 開闢和釋放棧空間以及什麼是"爆棧";
  • 方法呼叫時的棧空間表現;
  • 函式棧基於暫存器的回溯思路方案;
  • stp 命令解釋;

通過學習本文的這些知識可以為學習 Hook 的彙編方案做準備,而且對於想學習彙編的讀者可以作為彙編的入門知識來學習。

文章

?Contact Tracing

@享耳先森:為應對 COVID-19,蘋果和谷歌宣佈將在未來幾個月內部署聯絡人追蹤功能,宣告中兩家公司分享了這一技術的規範草案。在這篇文章中,Matt 介紹了是蘋果公司提出的 ContactTracing 框架,簡單來說:ContactTracing 會為裝置生成隨機程式碼,利用藍芽技術進行廣播並記錄所有近期接觸過的裝置。當某個使用者被確診了,衛生機構將請求得到 Ta 的隨機碼並進行登記,裝置會間隔的向衛生機構進行比對,萬一與名單中的裝置接觸過則提醒使用者儘早需求醫治。

? Why iOS Developers Feel Stuck In Their Careers & What To Do

@蓮叔:看這個標題就知道這並不是一個技術文章。iOS 從出現到現在已經超過 10 年時間,已經並不算一門很新的技術了。同樣的,iOS 工程師們也逐漸從新手到了老手,當然,也有一部分只是成了工作很多年的新手。但不管是誰,iOS 領域的同行似乎都持續在焦慮之中,從 16 年開始的創業浪潮退燒導致大量創業公司關門帶來的移動就業萎縮,到現在的大資料時代,作為前端、客戶端工程師所能為業務創造的價值似乎相對有限。作為結果,“iOS 沒人要了”似乎一直是籠罩在大家頭上的一片烏雲。

從這篇文章來看,似乎國外的 iOS 同行也或多或少在面臨相同的問題,感覺到了瓶頸。文章有兩個核心觀點:

  1. 焦慮的本質是急功近利,對於獲得回報所投入的時間不夠實事求是,我們應該要關注 long term success,即短期會讓你比較痛苦的方向,而不要醉心於 short term success,能夠給你一些立竿見影的成就感那種。 其實也就是延遲滿足。
  2. 目前的就業市場反應, 軟技能(Leadership、情商、溝通能力等)和技術能力本身同樣重要。

其實觀點不是新觀點,但能 serious 的拿出來討論,對於同行們肯定是好處,能夠讓大家更加重視這個問題。這裡提一點,很多軟技能:如 leadership,大家可能會覺得我不當 leader 是不是就不用 care,事實上不是,即便不帶人工程師也可以通過體現 leadership 去正面的影響自己的合作方、客戶和老闆和自己的看法和態度,形成正向的迴圈。文章裡面還有更多的相關討論,有興趣的同學可以看看。

? iOS 優化篇 - 啟動優化之 Clang 插樁實現二進位制重排

@looping:本文首先講述了二進位制重排的基本原理,然後嘗試 clang 插樁(編譯期靜態插樁)的方式來解決抖音團隊遺留下來的 基於靜態掃描+執行時 trace 的二進位制重排方案不能進行 100% 的符號覆蓋問題,並通過實際工程來探索實現了啟動時期所需的方法符號全覆蓋的二進位制重排方案。對通過二進位制重排來優化應用啟動感興趣的同學可以好好學習研究一番了。

一個易遷移、相容性高的 Flutter 富文字方案

@老驢:閒魚團隊不愧是最早實踐 Flutter 的,踩了無數的坑,也總結了無數經驗。本文就是閒魚團隊根據自己的需求,對 Flutter 中富文字的做了一套易遷移高相容的方案。富本文也一直是跨平臺方案的難點,有富文字方面需求的同學不妨來學習一下。

細化 Flutter List 記憶體回收,解決大 Cell 問題

@CrazyCoderShi:何謂大 Cell 問題?在基於 Native List 的渲染方案中,都會遇到大 Cell 問題。這個問題最直接的結果就是:導致記憶體過高。在 Flutter 裡同樣有這個問題,本質原因都是因為 List 進行回收的單位是 Cell,而不是 Cell 中的圖片。本文詳細介紹了手淘團隊通過細化 Flutter List 的回收能力,在 Cell 回收的基礎上,可以做到以圖片為單位進行回收。

FluentDarkModeKit 微軟的暗黑模式適配框架

@紅紙:FluentDarkModeKit 原名 DarkModeKit,本文是該庫的原始碼分析文章。開發者通過方法設定 Light 跟 Dark 對應圖片跟顏色。DarkMode 會使用中間類(DMDynamicImageProxy/DMDynamicColorProxy)將其儲存,在使用過程中,將所有事件轉發到對應模式下顏色或者圖片。

推薦人:ztlyyznf001

? Swift Logging

@四娘:當 App 或者服務上線之後,出了問題最有效的 Debug 手段之一就是檢視日誌,那麼該如何構建一套可靠的日誌系統呢?這周 NSHisper 帶來的是 swift-log 的介紹,推薦感興趣的同學閱讀。

? 用Dart語言來寫非同步程式

@老峰:在 iOS 開發中用過 Promise 對 async await 非同步程式設計概念並不陌生,本文作者詳細介紹了 Dart 中的 Main Queue, Event Queue、Microtask Queue 非同步執行順序及相互關係。

? iOS 淺談GPU及“App渲染流程”

@邦Ben:該文大致概括了 GPU 的工作原理,以及對比了 iOS,WebView,ReactNative,Flutter 的渲染流程,但是都比較概括,如此感興趣的可以另外找文章繼續深入瞭解。

? Flutter 究竟是如何渲染的?

@AidenRao:本文從原理層面講解 Flutter 渲染架構、渲染策略及渲染工作流水線。文章簡單易懂,配合作者的另一篇文章 iOS 淺談GPU及“App渲染流程” 閱讀,能快速的對 Flutter 的渲染原理有一定了解。

工具

? iOS執行緒數量監控工具

@含笑飲砒霜:一個用來監控整個 App 的執行緒數量和瞬間新建的執行緒數量的工具,當數量不合理的時候,就列印所有的執行緒堆疊,便於分析造成的原因。可參考閱讀對應的部落格,文中詳細介紹了開發這個工具的核心邏輯。

? DocTest:將單元測試程式碼置於註釋中

@EyreFree:DocTest 提供了一種在文件註釋中新增 Swift 程式碼示例並和預期結果的方法,並且可以自動測試,就像單元測試一樣。DocTest 通過與 Swift REPL(Read Eval Print Loop) 互動來實現測試程式碼的執行,依靠標準輸入傳遞每個程式碼語句,並通過標準輸出或標準錯誤讀取其結果。示例如下:

/**
    Returns the sum of two integers.

    ```swift doctest
    add(1, 1) // => Int = 2
    ```
*/
func add(_ a: Int, _ b: Int) -> Int { ... }
複製程式碼

? swift-outdated

@kemchenj:在使用 Cocoapods 的時候我們每隔一段時間就會用 pod outdated 來檢視哪些依賴可以升級了,但 Swift Package Manager 卻沒有這個功能,所以社群裡就有人自己寫了一個:

$ swift outdated

----------------------- ----------------- --------- --------
 Name                    Requirement       Current   Latest
----------------------- ----------------- --------- --------
 version                 2.0.0..<3.0.0     2.0.0     2.0.0
 files                   4.0.0..<4.1.0 ⬆️  4.0.2 ⬆️  4.1.1
 shellout                2.3.0..<3.0.0     2.3.0     2.3.0
----------------------- ----------------- --------- --------
複製程式碼

程式碼

? MPITextKit

文字控制元件是我們日常開發使用最多的控制元件之一。系統的 UILabel 由於是在主執行緒渲染,在一些情況下不能滿足效能要求,所以後續也有 YYText 這樣的框架出現。不過由於 YYText 已經有一段時間沒有維護了,這裡推薦它的一個代替方案,MPITextKit 。MPITextKit 具有下面這些特性:

  • 相容 UILabel API
  • 支援 AutoLayout
  • 基於系統原生 TextKit, 所以能夠使用所有系統文字屬性,例如:NSAttachmentAttributeName, NSStrikethroughStyleAttributeName, NSUnderlineStyleAttributeName 等等
  • 附件支援 UIImage、UIView、CALayer
  • 支援截斷文字設定
  • 支援非同步渲染
  • 支援排斥路徑
  • 支援文字選中
  • 支援文字佈局 debug

SwiftyBeaver

@張嘉夫:便捷、安全、多彩、靈活、輕量的日誌輸出類,支援 Swift 3, 4 & 5。在開發階段支援 Xcode 控制檯或直接輸出 log 檔案,釋出後可以將日誌加密並輸出到 SwiftyBeaver 平臺。此外,SwiftyBeaver 還提供了一個免費 Mac App,用來瀏覽、搜尋和過濾日誌。

內推

杭州 - 阿里巴巴淘系技術基礎平臺:高階無線工程師(P6)/ 無線專家 (P7)

  • iOS架構、底層方向
  • iPad、新特性方向
  • 業務開發和架構方向(iOS/Adnroid)

感興趣的歡迎加微信瞭解具體要求。VX: damonwong2。也可以直接傳送簡歷到 coderonevv@gmail.com

老司機推薦

老司機週報團隊聯合知識小集和 SwiftGG 翻譯組收錄了一份靠譜的內推職位。

如果你想找工作,點這裡:www.yuque.com/iosalliance…

如果你想招人,點這裡:www.yuque.com/iosalliance…

當然,也歡迎你關注我們每一期的週報,我們會在每期週報底部及時更新編輯內推崗位。

關注我們

我們開通了公眾號,每期釋出時公眾號(OldDriverWeekly)會推送訊息,歡迎關注。

老司機 iOS 週報 #110 | 2020.04.20

同時也支援了 RSS 訂閱:github.com/SwiftOldDri…

說明

? 表示需翻牆,? 表示編輯推薦

預計閱讀時間:? 很快就能讀完(1 - 10 mins);? 中等 (10 - 20 mins);? 慢(20+ mins)

相關文章