iOS摸魚週報 第四十七期

語言: CN / TW / HK

本期概要

  • 話題:蘋果多個產品線的更新介紹
  • 面試模組:動態庫與靜態庫的區別
  • 優秀部落格:關於該不該換工作以及如何準備面試
  • 見聞:一個新的、偏技術領域的部落格推薦模組
  • 學習資料:Rust 資料結構與演算法
  • 開發工具:Aria2GUI,一款支援多種協議的輕量級命令列下載工具

本期話題

@zhangferry:蘋果的多個產品線帶來了一波更新。

macOS Monterey 12.3

  • Python 2 被從系統中移出了,但新系統中也並沒有預裝 Python 3,需要開發者手動安裝。
  • Universal Control(通用控制):鍵盤、滑鼠和觸控板可以在 Mac 和 iPad (iPadOS 15.4) 端無縫銜接。
  • M1 晶片的電腦可以搭配支援空間音訊的 AirPods 使用頭部追蹤功能。

iOS 15.4

  • 支援戴口罩的 FaceID 功能,僅支援 iPhone 12 及之後的機型。
  • 新增了 37 個 Emoji 表情。

Xcode 13.3

  • 新增了一項針對 Swift 的編譯優化

defaults write com.apple.dt.XCBuild EnableSwiftBuildSystemIntegration 1

  • Instruments 獲得了多項提升,提高了 leaks 、memory graph debugger 掃描的準確性等。

問題收集:

  • 反饋打包時有 pod 相關異常
  • 反饋編譯變慢

Swift 5.6 Released

還有一個小優化:SE-0290: Unavailability Condition

面試解析

整理編輯:JY

靜態庫和動態庫的區別

靜態庫(Static Library)

特點如下:

  • 分發檔案大

  • 靜態庫預設僅將有用到的類檔案 linkMach-O 中 (以類檔案為最小連結單位)

  • ipa 包小(為了 App 瘦身,儘量將程式碼放靜態庫中)

    • 靜態庫中某個目標檔案的程式碼沒有被任何地方引用,則這個目標檔案不會被連結到可執行檔案中去(分類程式碼經常被優化掉,一般都使用 -Objc-all_load 或者 -force_load 來處理靜態庫分類載入問題)
  • App 冷啟動速度快

    • 前提是不使用 動態庫拆分 搭配 動態庫懶載入方案
    • App 啟動流程中有 rebasebind,多個靜態庫只需要 rebasebind 一次
  • 存在符號衝突可能

  • 共享 TEXT 段
    • iOS 9 以前單個 Mach-O 的 TEXT 限制 60M
    • iOS 9 以後單個 Mach-O 的 TEXT 限制 500M
  • 不需要額外簽名驗證
  • 靜態庫符號的可見性可以在連結期間被修改
  • 檔案格式多為 fat 格式的靜態庫檔案
  • 形式多為 .a.framework
  • 靜態庫不含 bitcode 時,引用靜態庫的目標部署時就不能包含 bitcode

動態庫(Dynamic Library)

特點如下:

  • 分發檔案小

  • ipa 包大(前提是不考慮懶載入的情況)

    • 動態庫會把整個 lib 複製進 ipa
  • App 冷啟動速度慢

    • App 啟動流程中有 rebasebind,多個動態庫只需要多次 rebasebind
  • 需要設定合適的 runpath

  • 需要動態載入

  • 需要簽名且需要驗證簽名

    • 會檢查 framework 的簽名,簽名中必須包含 TeamIdentifier,並且 framework 和 host App 的 TeamIdentifier 必須一致
    • Xcode 重簽名,保證動態庫簽名一致性
  • 需要匯出符號

  • 重複的 arch 結構

  • App 與動態庫中重複程式碼可以共存,不會發生符號衝突

    • 因為可執行檔案在構建連結階段,遇到靜態庫則吸附進來,遇到動態庫則打個標記,彼此保持獨立性。
    • 對於來自動態庫的符號,編譯器會打個標記,交給 dyld 去載入和連結符號,也就是把連結的過程推遲到了執行時執行。(比如 App 使用的是 3.0 版本 SDK,動態庫使用的是 1.0 版本 SDK,能正常執行,但是會有風險)
  • 連結後需要包含分發大小

  • 冷啟動過程中,預設會在 main 函式之前載入

    • 預設情況下,過多的動態庫會拖慢冷啟動速度
    • 如果採用懶載入動態庫的形式,能夠加快 App 的啟動速度,可以使用 dlopenbundle 懶載入優化
  • 檔案格式 Mach-O(一個沒有 main 函式的可執行檔案)

  • 動態庫不包含 bitcode 時,引用動態庫的目標部署時可以包含 bitcode

  • CocoaPodsv0.36.0 開始,可新增關鍵字 use_frameworks! 編譯成類似 Embedded Framework 的結構(可以稱之為 umbrella framework

    • 缺點:預設把專案的依賴全部改為動態庫(可使用 use_modular_headers!,也可以在 podsepc 新增 s.static_framework = true 規避)
    • CocoaPods 執行指令碼把動態庫嵌入到 .appFramework 目錄下(相當於在 Embedded Binaries 加入動態庫)

優秀部落格

整理編輯:皮拉夫大王在此

本期優秀部落格主題相對輕鬆,聊聊面試相關和成長相關的事情。本來想借助本期內容整理下 rebase & bind 的相關技術細節,但是這周被某些自媒體散佈的裁員訊息給刷屏了,恰巧我本人也是在最近換了工作,因此藉助這個機會和大家一起暫停下技術學習的腳步,擡頭看看外面的情況。

閱讀後你將獲得什麼?

  • 如果你在猶豫自己是不是該換工作,那麼可以從文章中找到部分答案;
  • 東野浪子和蒼耳兩位大佬是非常資深的大廠面試官,他們的建議是非常中肯的;
  • 我本人近期面試的一些細節;
  • 儘管不認同面試問八股文,但是還是給大家準備了八股集合,以供大家增強面試信心;

1、如果你在猶豫期,請看下文

1.1 淺談如何理性的判斷自己是否應該換工作 -- 來公眾號:東野職場派

@皮拉夫大王:去年推薦過這篇文章,考慮到目前是金三銀四,有些同學可能之前沒有看過,因此再推薦一次。

2、面試官篇:知己知彼,面試官的關注點

2.1 給面試者的一些建議 -- 來自:蒼耳的技術部落格

2.2 面試過500+位候選人之後,想談談面試官視角的一些期待 -- 來公眾號:東野職場派

@皮拉夫大王:以上兩篇文章的觀點本質上來說是一致的,面試官期望候選人是在平時工作中是有所思考和行動的人,而不是臨時抱佛腳去應試。因此用半年時間去刷題複習基礎知識,不如用這個時間去認真打磨一個專案

3、候選人篇:近期面試的一些細節

3.1 剛換工作,說點找工作相關的事情~ -- 來自公眾號:皮拉夫大王在此

@皮拉夫大王:這是我本人近期的親身經歷,前段時間和幾個朋友聊了聊換工作的事情。包括:該走該留?如何準備?如何寫簡歷?如何投簡歷?面試中和麵試後各有哪些問題?等等

4、最全基礎知識整理

4.1 《史上最全iOS八股文面試題》2022年 -- 來自51CTO:宇夜iOS

@皮拉夫大王:面試中多多少少會考察到部分基礎知識,對基礎不放心的同學可以看看。

見聞

整理編輯:zhangferry

這一週閱讀或者觀看到的有價值的訊息。

1、深度學習撞牆了 -- 來自:機器之心

@zhangferry:早在 2016 年,深度學習教父級人物 Hinton 就曾說過,我們不用再培養放射科醫生了。但如今 AI 並沒有取代任何一位放射科醫生,問題出在哪呢?在 Robust.AI 創始人 Gary Marcus 看來深度學習可能就要撞牆了。整個 AI 領域需要尋找新的出路。

深度學習本質上是一種識別模式,當我們只需粗略結果時,它非常適合,但是對於需要精確性操作且風險很高的事情,像放射學和無人駕駛,就需要很謹慎了。人工智慧確實沒有我們想象的進化那麼快,所以它的未來是悲觀的嗎?並不是,作者提出 Hinton 這樣的先驅把深度學習的研究方向帶偏了,應當將深度學習和符號處理結合起來,這種混合人工智慧可能才是最好的方向。

2、【譯文】谷歌搜尋正在消亡 -- 來自少數派:趙喧典

作者認為 reddit 才是目前最受歡迎的搜尋引擎,而谷歌搜尋正在走向消亡。認為谷歌不再被認可的原因有這幾個:

  • 廣告:谷歌的大部分收入來源於廣告,但過多廣告佔據搜尋詞條會嚴重影響使用者體驗。
  • SEO 優化:很多人的工作就是搜尋引擎優化,這違背了公平也會導致搜尋質量下降。
  • 人工智慧:人工智慧在嘗試幫你找到你想要的內容,但這種揣測經常讓人不滿意。

3、領導,我想改善團隊的分享氛圍 -- 來自公眾號:hockor

@zhangferry:大多數人都會在工作中遇到技術分享這個事情,作為 TL 應該如何打造良好的分享氛圍呢?首先明確良好的分享氛圍是有很大好處的,比如提升團隊的技術視野、發現團隊牛人、提升團隊戰鬥力、擴大團隊影響力等。分享形式較普遍的定期舉行技術分享會,任何的分享行為都應該被鼓勵。“分享本身是一種精神上自我實現的行為,所以無論分享內容如何,至少這種行為是慷慨的,我們應該及時的、積極的反饋,去鼓勵他們往前更進一步”。

同時作為分享的參與者,我們應該抱著探索者的積極的心態去聽,有參與感的學習形式是非常高效的。

4、Usage statistics of content languages for websites -- 來自網站:W3Techs

@zhangferry:當前世界上的網站按語言劃分的話,英語最多,這個毋庸置疑。但第二多的竟然是俄語,更令人意外的是,作為使用人口非常多的漢語,其網站數量佔比竟然排到了第 10 位。我能想到的原因是,俄語地區網際網路發展比較早,催生了很多網站;漢語雖然使用人數多,但是相對集中,國內網際網路的發展比較晚,近幾年移動網際網路浪潮催生了很多 App,但網站的建立則很少。

網站是目前人們獲取資訊最重要的途徑之一,英語網站遠超其他語種,也反應了當前英語世界的話語權是更大的。

學習資料

整理編輯:Mimosa

Rust 資料結構與演算法

地址:https://github.com/QMHTMY/RustBook

一本 Rust 書籍,有簡體和繁體版(英文版和日文版正在撰寫中),內容包括演算法分析,基本資料結構和演算法,外加一些實戰,共有九章。包含了大家常用的常見的資料結構的實現和講解,配有詳實的程式碼和清晰簡明的圖解。

工具推薦

整理編輯:CoderStar

Aria2GUI

地址:https://github.com/yangshun1029/aria2gui

軟體狀態:免費

軟體介紹

Aria2GUI 是一款支援多種協議的輕量級命令列下載工具,可以輕鬆的下載離線資源。

Aria2GUI

關於我們

iOS 摸魚週報,主要分享開發過程中遇到的經驗教訓、優質的部落格、高質量的學習資料、實用的開發工具等。週報倉庫在這裡:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的內容推薦可以通過 issue 的方式進行提交。另外也可以申請成為我們的常駐編輯,一起維護這份週報。另可關注公眾號:iOS成長之路,後臺點選進群交流,聯絡我們,獲取更多內容。

往期推薦

iOS摸魚週報 第四十六期

iOS摸魚週報 第四十五期

iOS摸魚週報 第四十四期

iOS摸魚週報 第四十三期