老司機 iOS 週報 #47 | 2018-12-10

老司機iOS週報發表於2018-12-10

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

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

福利

? 我們發福利啦~

週報已經快陪伴大家走過一年的時間,非常感謝各位朋友的支援和厚愛。為了在 2019 年能更好地為大家服務,我們舉辦了一個問卷調查活動。在 12 月 27 日,我們會在參與問卷的朋友中選取合適的幾個人贈與學習大禮包和現金獎。至於獎品是什麼,大家可以在這條微博中瞭解,轉發還有額外的抽獎~我們渴望聽到你們的聲音!

新聞

? Result 型別將加入標準庫

Result 型別經歷了一整個月的討論終於決定加入標準庫,預計 Swift 5 就能完成實現,這次的提案關注的人非常多,經歷了兩次修改三次討論才最終通過。

討論的焦點主要集中在 Result.Error 的定義上,喵神也寫了一篇文章討論這個問題,一句話總結就是,Swift 出於相容性和實現的考慮,一直沒有實現 Typed Throw,所以 Result.Error 很難實現為一個泛型引數,甚至在草案階段決定讓 Result.Error 不遵循 Swift.Error。

後來 Swift 團隊專門給這個提案開了後門,調整了泛型引數的實現,讓 Swift.Error 成為了目前唯一一個可以作為泛型引數存在的泛型型別,以便與 Cocoa 的 API 進行更好的互動,才結束了這場討論。

從這一次也可以看出,Swift 核心團隊還是希望讓丟擲的錯誤能夠有具體的型別(而不是一個泛型的 Swift.Error),所以才會開後門使用這種過渡性的方案,這次的提案讓我感覺 Typed Throw 還是有希望的。

另外如果大家有相容性方面的擔憂的話,由於提案的作者是 Alamofire 負責人之一,所以最終通過的版本與 Alamofire 採用的 Result 差異很小,如果你採用的是這個版本的 Result 的話,就不必過多擔心。

Flutter 1.0 正式版: Google 的便攜 UI 工具包

萬眾矚目的 Flutter 1.0 終於正式釋出,從我們首次看到 Flutter 的 Beta 測試版,到如今的 1.0 正式版,總共經過了 9 個多月。Flutter 的高效能跨平臺渲染與熱過載等優秀的特性相信會讓移動開發者們眼前一亮,在早先 beta 期就已經有很多公司與團隊進行了這方面實踐,現在 1.0 來了,作為移動開發者當然要感受一下 Flutter 的魅力。

文章

? ? ? Dependency Injection on iOS — part 1-4

本長文的主題是關於架構的,切入點是依賴注入在 iOS 上的應用,共分成了四篇文章。作者從描述模組耦合的概念,到介紹使用依賴注入能帶給我們的好處(可複用性、可維護性、可擴充套件性和可測試性),以及推薦了一款依賴注入的框架(Swinject)後開始進入正題 —— 通過編寫和優化一個簡單應用來實踐依賴注入的概念和感受它帶來的好處。全文結構非常清晰,舉例也很詳盡,是一篇學習和感悟架構,特別是依賴注入的好文章。

? ? iOS App冷啟動治理:來自美團外賣的實踐

文章整理了 APP 冷啟動的三個階段,對三個階段分別提出了存量解決方案、管理增量方案和監控體系。下面幾點是文章觀點的總結:

  • 冷啟動階段T1: 點選 APP 圖示進入至 main 函式,這兩者之間的耗時
    • 程式碼瘦身,廢棄無用程式碼和資原始檔
    • 延時 +load 函式,將函式延遲到合適的觸發時機,比如說冷啟動結束之後
  • 冷啟動階段T2: main 函式後至 didFinishLaunchingWithOptions 函式執行完畢,這兩者之間的耗時
    • 整理 APP 啟動階段,順序化子專案的啟動順序
    • 分階段啟動,利用自驗的 Kylin 專案,將子專案的註冊資訊(啟動階段、啟動需要執行的程式碼等)寫入 __DATA 資料段中,執行期讀取 __DATA 段程式碼,並賦予執行。
    • 利用工具(Time Profile/自研的 Caesium)整理執行過程中的一些隱晦耗時,比如歸檔操作、IO操作、資源任務等
  • 冷啟動階段T3: didFinishLaunchingWithOptions 函式至首頁渲染完成,這兩者之間的耗時
    • 將 APP 的 RootViewController 設定為閃屏,同時進行首頁UI的構建,加快 RootViewController 的載入
    • 整理首頁載入的序列操作,優化體驗成並行操作
  • 資料監控:除了上述的優化外,建立監控體系,保證持續優化成果
    • 冷啟動的開始與結束時間對比,值得注意的是這裡的開始時間採用了 APP 程式建立時間
    • 冷啟動過程中的關鍵節點都有手動新增的測速點,並自動上報

? 如何提高工作效率 - 自動化篇

在本文中,作者向我們介紹了 macOS 環境下幾種自動化的實現方案,並以自己的親身實踐案例為我們講述了大體的實現流程,以下為文中的案例:

  • 利用 Shell Script 和啟動載入任務,在開機過程中自動配置雙網路卡
  • 利用 Apple Script 訪問 Microsoft Outlook 自動生成和填充郵件,完成每日郵件彙報工作
  • 利用 Apple Script 和熱鍵,快速定位當前 Finder 路徑到 iTerm 的視窗當中
  • 利用 Apple ScriptAlfred WorkFlows 進行快速儲存/搜尋記錄瞬間想法
  • 利用 Shell ScriptApple Script 定時拉取並編譯程式碼

? iOS 記憶體管理的那些事兒

iOS 中的記憶體管理一直是令開發同學們比較頭痛的事情,自 ARC 問世以後,雖然不再需要我們手動管理記憶體,但是掌握記憶體管理的相關知識依然是十分有必要的。

作者通過研讀原始碼的方式向我們詳細講解了記憶體管理的實現原理,並列舉了一些日常開發中容易導致記憶體洩漏的常見場景,掌握這些有助於我們在複雜業務場景中更好的避免記憶體相關的問題。並且作者後續會介紹一些開源檢測記憶體洩漏的工具及實現,大家可以持續關注。

? Rethinking Design Patterns in Swift: State Pattern

這篇文章展示瞭如何在 Swift 中實現狀態模式(State pattern),藉助 Swift 強大的能力,讓模式實現變得簡單而又靈活。此文通過一個例項來探索狀態模式的各個方面,並且評估其處理需求變更的能力。然後還會討論實現該模式的關鍵考量、收益以及實際應用。

? 技術人的成長

作者從自身的經驗和感悟出發,從三個維度描述了技術人的成長道路

  • 抵禦所謂“全棧”的誘惑,聚焦領域。
  • 擴大視野,提高技術敏銳程度。
  • 多看多嘗試,不要空想

總體來說,就是到了一定的技能熟練度以後,從廣度上擴充自己的知識面,從深度上鑽研某一個垂直領域,將能夠極大的幫助大家從普通工程師進階到高階工程師。

? Category:從底層原理研究到面試題分析

隨著移動端的發展,從 weak 面試題的一步步升級就能明白,我們應該多進行深入瞭解底層實現細節。

作者從原始碼進行一步步分跟蹤和分析,整理 Category 整個的執行順序,非常適合想了解其工作原理的同學們看。並且還提供了一個簡單動畫示意圖。通過閱讀,可以清晰地回答面試中常見的幾個 Category 相關的問題。

另外 loadinitialize 也給出了原始碼分析和對比表格。在準備面試的同學,尤其適合閱讀一番。

? iOS: ARM64不定函式傳參問題除錯剖析

從實際開發中遇到的一個平臺相關的 crash 問題出發,通過程式碼對比,研究了在 x86-64 架構和 ARM64 架構對於不定函式引數傳遞的方式——特別是 iOS 系統的不同之處,同時也解答了為什麼在呼叫帶不定引數型別的 C 函式指標時,應該顯示將其強轉為對應引數型別的函式指標問題。

? 【譯】Swift 中的面向協議程式設計:是否優於物件導向程式設計?

本篇是 SwiftGG 最新出爐的譯文,原文在上月 週報第42期 推薦過,可以再回顧一下。

? Swift Protocols: Tips and Tricks

ProtocolSwift 的基礎,我們可以定義方法,甚至提供預設實現。本文介紹了 Protocol 的一些小 tips,比如 協議組合Protocol extensions、利用 Protocol 實現模板方法設計模式等。

? 8 Useful Swift Extensions

文中列舉了 8 個Swift中比較實用的 Extensions,比如字串中字元個數、計算兩個日期之間的天數,給字串新增字首等。當然,我覺得這 8 個遠遠不能滿足於日常的開發,所以我更推薦大家看一下 SwifterSwift 這個庫,裡面都是很實用的 Extension。如果你有什麼不錯的 Extension 推薦,也可以給這庫貢獻自己的程式碼哦。

? simctl

simctl 是蘋果提供給開發者驅動 Xcode Simulator 的命令列工具。我們能夠通過它做到:啟動模擬器,在桌面和模擬器之間複製和貼上,進行視訊錄製等。

? Swift Program Distribution with Homebrew

本文介紹了當你建立了 mac 上的命令列工具的時候,如何進行分發,文中介紹的工具是 Homebrew 。

  1. 建立一個 Makefile 檔案
  2. 編寫一個 Homebrew formula (相當於編譯打包)
  3. 自測需要,可以先試試本地安裝,確保安裝過程順利
  4. Homebrew 安裝 formula 是基於 Tap 的,所以需要釋出一個 Tap
  5. 使用者可以根據遠端的 Tap 來安裝 formula 了

? 與 JOSE 戰鬥的日子 - 寫給 iOS 開發者的密碼學入門手冊

JOSE (Javascript Object Signing and Encryption) 定義了一系列標準,用來規範在網路傳輸中使用 JSON 的方式,本文介紹了 如何使用 Security.framework 處理 JOSE 中的驗證。對比已有的 JOSE 實現框架,譬如 JOSESwiftJSONWebToken.swiftSwift-JWTvaper/jwt 等等,作者的方案優勢在於同時支援 RSA 和 ECDSA ,並且不需要引入複雜的依賴關係

工具

Publish Your Flutter App on macOS

最近 Flutter 擴張勢頭似乎沒有停下來的意思,反而看起來越來越凶猛了。

Flutter 除了可以寫 iOS,Android App 之外,其實,也是“支援” macOS, Windows 和 Linux 的。只是這並不是那種官方支援,而只是把移動版 App 直接跑在 Desktop 上, 類似明年 macOS 要支援 iOS App 執行一樣。

Google 的 Github Repo 下有一個叫 flutter-desktop-embedding 的專案,就是做這樣的橋接工作的,只是這庫確實不是很好用,使用比較麻煩。

於是有第三方開發者做了基於 flutter-desktop-embedding 的工具,可以方便的將你已有的 Flutter 工程打成 macOS 包。同時他們還做了一個小型商店,開發者可以一鍵上傳,其他人也可以很方便的下載安裝。

有興趣的童鞋可以嘗試一下把自己的 Flutter App 跑在 macOS 上,來看看那是什麼樣的感覺。

音視訊

ggtalk | 聊聊 Swift 這四年(下)

上週推薦了上部,收到了不錯的反響。在這期(下)中,幾個程式設計師聊了最近幾年 Swift 領域發生的事情,比如 jspatch 導致的大規模下架事件,第二第三屆 Swift 開發者大會的一些故事。最終探討了 Swift 的未來,內容同樣精彩,不容錯過。

內推

關注我們

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

老司機 iOS 週報 #47 | 2018-12-10

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

本期編輯

@四娘@享耳先森@Damonwong@折騰範兒_味精@張嘉夫@AidenRao@Parsifal@aaaron7@方秋枋@kyo@tom510230@anotheren@水水@looping@老老老老老老老驢@小非86@邦Ben@紅紙@含笑飲砒霜@JimQ

說明

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

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

相關文章