老司機 iOS 週報 #119 | 2020-07.13

老司機技術週報發表於2020-07-13

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

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

熱烈歡迎週報團隊的第 33 個編輯 - @JonyFang!他是 TIME 時間卡 App 的開發者,目前就職於本來生活網 P2C 專案組。

新手推薦

? Benefits of using throwing functions (try) - Swift's most underrated feature?

@zvving:Swift 新手面對 do-try-catch 常望而卻步,呼叫時使用 try? 輕率處理,對外提供錯誤處理時一般使用 Result 返回錯誤,Throwing 幾乎不是一個可選項。 本文作者認為 do-try-catch 可能是最被低估的 Swift 語言特性,並給出合理使用錯誤處理的建議:

  • Result & Throwing 都可以作為函式返回錯誤處理的方式
    • 需要業務方顯式處理 Error 時,推薦 Result
    • 業務方不關心錯誤,期望更外層處理時,推薦 Throwing
    • 一個方法內有多種型別錯誤需要返回時,只能選擇 Throwing
  • XCTestCase 對 Throwing 有很好的支援:Case 書寫可以更聚焦於自身邏輯
  • Result 與 Throwing 可以方便的相互轉化

關於錯誤處理文中未提及的幾點也值得留意:

  • 雖然語法相似,但 swift-try-catch-error(錯誤處理) 與 objc-try-catch-exception(異常處理)並不相同
    • Objc 中異常處理因為效能和安全問題,不推薦使用
    • Swift 中的錯誤處理不涉及解析呼叫棧,效能好非常多,可以和 return 語句相媲美,推薦靈活選用
  • Swift 中錯誤處理也要留意資源清理的工作,推薦通過 defer 完成

文章

? ? Flutter 上的記憶體洩漏監控

@CrazyCoderShi:Flutter 所使用的 dart 語言具有垃圾回收機制,有垃圾回收就避免不了會記憶體洩漏, 記憶體洩漏的檢測在各個端都是 Debug 的重頭,iOS 側的 Instruments , Android 側的 LeakCanary ,本文將會帶你實現一個 Flutter 可用的 LeakCanary。

? ? Apple Clip 技術詳解

@享耳先森:蘋果在 WWDC2020 上釋出了 App Clip,本文從產品定位及實現細節上介紹了 App Clip 的方方面面,還與 PWAInstant Apps小程式 進行橫向比對,推薦閱讀。

? 乾貨 | 攜程 RN 渲染效能優化實踐

@looping:本文從理論方案、操作過程以及實用工具三個方面系統地總結介紹了攜程在 React Native 渲染優化方面的實踐經驗,同時部分優化理論也同樣適用於 H5 與 Native 平臺。希望這篇文章能為對跨平臺效能優化感興趣的小夥伴帶來一些實際的幫助與啟發。

? iOS Memory 記憶體詳解

@含笑飲砒霜:為了從根本上更好地理解和分析 iOS 系統上的記憶體特性,我們要了解一般作業系統的記憶體管理、iOS 系統記憶體和 app 的記憶體管理。本文主要內容的目錄如下:

  • 作業系統的記憶體機制

    • 馮.諾伊曼結構
    • 儲存器的層次結構
    • CPU定址方式
    • 虛擬記憶體
    • 記憶體分頁
  • iOS 記憶體機制

  • iOS 系統記憶體佔用

    • clean memory & dirty memory
    • compressed memory
    • 記憶體佔用組成
  • iOS app 記憶體管理

    • iOS app 地址空間
    • 引用計數
    • 迴圈引用
    • weak 和 unowned
    • 不會導致迴圈引用的情況
  • OOM 崩潰

    • jetsam機制
    • 如何檢測OOM
    • OOM的常見情況
  • 記憶體分析

? The Origins of Objective-C at PPI/Stepstone and Its Evolution at NeXT

@蓮叔:OC 毫無疑問是移動網際網路時代最有影響力的程式語言之一。我們都知道 OC 是 NeXT 主要程式語言,隨著 NeXT 被蘋果收購後就成為蘋果主推的程式設計生態,但其實 OC 並不是 NeXT 發明的。OC 的前身叫 Object-Oriented Pre-Compiler(OOPC),其作用是將 Smalltalk 語言轉換為 C 語言。當時正處在“軟體危機”的時代,關於如何更好的提升開發效率的研究如火如荼,OOPC 也是其中的一個研究專案。關於 OC 的發展值得回味的地方還有很多,有興趣的同學可以看一下這篇由 OC 原作者和 NeXT 退休工程師共同撰寫的關於 OC 發展歷史的論文,非常詳細的列舉了不同時代的 OC 的迭代,可以看到不同的 feature 分別都是在什麼樣的背景下被發明出來的,對於未來怎麼用好這些 feature 也非常有幫助。

? 動手實現一個精簡的動態佈局 DSL

@老峰:AutoLayout 是目前 iOS 上常用的佈局方案,而它的本質也是通過 Cassowary 求出元素具體的位置與大小。這個系列作者將基於 Flex 佈局演算法,打造一個基於 C++ 的跨平臺佈局 DSL,實現一個精簡動態佈局引擎。那怎麼才能讓資料動起來呢?React Native 是通過 javascript 來實現資料動態化的,而這個系列作者基於編譯器前端技術實現一個自定義的指令碼,利用 C++ 實現一個精簡的指令碼直譯器完成資料動態化。Flex + Script 實現元素的佈局計算,再通過原生渲染。對自定義動態佈局 DSL 感興趣的讀者不防閱讀。

? Flutter 中的圖文混排與原理解析 | 開發者說·DTalk

@極速男孩:圖文混排是在開發中比較常見的需求,在 flutter 中我們主要通過在 Text.rich 中新增 TextSpan 和 WidgetSpan 來實現,我們可以通過 WidgetSpan 來新增任何你想要的 Widget,包括 Image 和 Card 等。這篇文章主要通過分析 RichText 的原始碼,看到 flutter 如何通過 MultiChildRenderObjectElement 來管理當中的 Widget,並如何一步步的如何去繪製這些 Widget 的。

? iOS Jailbreak Principles 0x02 - codesign and amfid bypass

本文是 iOS Jailbreak Principles 系列文章的最新一篇。前面的文章介紹了從核心漏洞到 tfp0,再到 rootfs 系統可讀寫。但到這為止,我們能做的事情還是比較有限的,為了做更多事情需要控制系統的 binary 或者分發自己的 binary 到系統,而為了做到這樣,則必須繞過 codesign 機制。本文分析了 iOS 12 以後的 codesign 機制,隨後從 amfid 入手分析了其繞過方案和實施過程。

? @StateObject 和 @ObservedObject 的區別和使用

@JonyFang:今年 SwiftUI 補完了不少內容,其中狀態管理方面是一個重要的話題。對於那些從外界接受 ObservableObject 的 View,究竟是使用 @ObservedObject 還是 @StateObject,需要根據情況和需要確定。像是那些存在於 NavigationLink 的 destination 中的 View,由於 SwiftUI 對它們的構建時機並沒有做 lazy 處理,在處理它們時,需要格外小心。本篇部落格文章展開介紹了 @StateObject 和 @ObservedObject 的區別和使用。

? iPadOS 滑鼠的設計哲學

@張嘉夫:作者王禹效在這篇文章裡詳細分析了 Apple 是如何為 iPadOS 設計滑鼠功能的,包括與傳統桌面作業系統滑鼠在邏輯、顯示和設計上的區別,以及 Apple 做出這些改變的原因。作者認為其實 Apple 不是什麼魔法師,只是在設計時認真的去為使用者做考量,願意在這些別人不在意的細節上投資。一點點積累之後,就有了自己獨特的使用者體驗。

? iOS Crash 分析攻略

@老驢:淘系技術出品的一篇關於 Crash 的文章。從基礎到深入的介紹 Crash 日誌渠道、Crash 捕獲的原理、看懂 Crash 日誌、Crash分析方法。這些東西可能在平時的開發中已經被 crash kit 工具所處理,很多時候大家並不會去深究其中的原理和含義。而這篇文章就很好的補充了這些。

其中的一些 debug 技巧很實用,在開發中也可以嘗試著實踐一下。總之,這是一篇不錯的從入門到精通類的文章,值得一讀。

音訊

? 網戀奇遇記 :偶遇殺豬盤之我能反殺

網路一線牽,珍惜這段緣;時間套路深,網戀需謹慎。

這期播客講述了一個程式設計師使用網戀交友應用後遇到“愛情騙子”的故事,厲害的是小哥憑藉執著的正義感最後成功追回騙款,還增加了額外收入。希望通過這期節目可以提高大家對網戀的警惕性。前 5 分鐘主播們在日常寒暄,著急的朋友可以從 5 分鐘後開始直接進入。

內推

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

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

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

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

關注我們

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

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

說明

? 表示需某工具,? 表示編輯推薦

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

相關文章