iOS摸魚週報,主要分享開發過程當中遇到的經驗教訓、優質的博客、高質量的學習資料、實用的開發工具等。週報倉庫在這裏:github.com/zhangferry/… ,若是你有好的的內容推薦能夠經過 issue 的方式進行提交。另外也能夠申請成爲咱們的常駐編輯,一塊兒維護這份週報。另可關注公衆號:iOS成長之路,後臺點擊進羣交流,聯繫咱們,獲取更多內容。html
整理編輯:人魔七七ios
當咱們的工程首次使用 Cocoapods 管理第三方庫的時候或者當咱們每次編輯 Podfile 文件的時候好比:添加,刪除或者編輯一個 pod 庫的時候,都須要執行該命令。git
pod install
命令,會下載安裝新的 pod,並把每一個 pod 的版本寫到 Podfile.lock 文件裏。這個文件跟蹤全部的 pod 庫及其依賴的版本並鎖定他們的版本號。pod install
的時候,只解析 Podfile.lock 中沒有列出的pod依賴項。1. 對於Podfile.lock 列出的版本,不須要檢查 pods 是否有更新直接使用既有的版本安裝。2. 對於Podfile.lock 未列出的版本,會根據Podfile 描述的版本安裝。Podfile 文件是 pod 執行的核心文件,它的解析邏輯推薦看這篇:Podfile 的解析邏輯。github
pod update 能夠全局升級,也能夠指定 podName 單個升級。當咱們執行 pod update podName
的時候,會忽略 Podfile.lock 文件的版本,根據 Podfile 的定義儘量更新到最新的版本,並更新 Podfile.lock 文件。該命令會一樣適配於 pod 庫 podspec文件內部定義的依賴。 能夠經過pod outdated
檢測出過時的依賴版本和可升級版本。面試
對於 install 和 update 有兩個經常使用參數:算法
pod repo update
。推薦使用 Gemfile 管理 pod 版本,每次執行 pod 經過 bundle 進行,例如: bundle exec pod install
。編程
工程持有管理者對項目進行 CocoaPods 初始化的時候會有一個 Podfile.lock 這個文件咱們須要歸入版本控制裏。小程序
若是須要更新某個庫到某一個版本,由項目持有管理者採用 pod update podName
的方式更新某個庫到必定的版本。而後提交 Podfile.lock 和 Podfile 文件。swift
整理編輯:zhangferryxcode
問題背景
經過某個版本的 Xcode 生成的 Swift 庫(Framework),在另外一臺機器(不一樣版本 Xcode)沒法識別,報上述錯誤。
問題分析
該錯誤是因爲編譯器不兼容致使的,錯誤含義是由 Swift 5.3.2 編譯器(編譯器版本能夠經過 swift --version
查看)編譯的module,特指 swiftmodule
文件,沒法被 Swift 5.3 的編譯器所識別。swiftmodule
文件用於描述Swift內部的方法聲明,它是二進制格式的,會根據不一樣的架構生成不一樣的版本。但也正由於其二進制格式的特性,沒法跟隨編譯器的升級進行調整。這個問題對應的就是 ABI 穩定中的 module stability。這裏引用喵神的一段博客內容:
ABI 穩定是使用 binary 發佈框架的必要非充分條件。框架的 binary 在不一樣的 runtime 是兼容了,可是做爲框架,如今是依靠一個
.swiftmodule
的二進制文件來描述 API Interface 的,這個二進制文件中包含了序列化後的 AST (更準確說,是 interface 的 SIL),以及編譯這個 module 時的平臺環境 (Swift 編譯器版本等)。ABI 穩定並不意味着編譯工具鏈的穩定,對於框架來講,想要用 binary 的方式提供框架,除了 binary 自己穩定之外,還須要描述 binary 的方式 (也就是如今的 swiftmodule) 也穩定,而這正在開發中。未來,Swift 將爲 module 提供文本形式的
.swiftinterface
做爲框架 API 描述,而後讓將來的編譯器根據這個描述去「編譯」出對應的.swiftmodule
做爲緩存並使用。這一目標被稱爲 module stability,當達到 module stability 後,你就可使用 binary 來發布框架了。
問題解決
上面說的 module stability 已經實現了,就是能夠經過 .swiftinterface
文件描述二進制包。它的實現對應一個編譯參數-enable-library-evolution
,在 Build Setting 裏就是 Build Libraries for Distribution
,咱們將其設置爲 YES ,生成的 Framework 裏就會包含對應的 .swiftinterface
文件,就能實現不一樣版本編譯器之間的兼容問題。
但到這裏還沒徹底結束,遇到了另外一個問題:
/*.framework/Modules/*.swiftmodule/arm64-apple-ios.swiftinterface:5:8: cannot load underlying module for 'SnapKit'
failed to build module '*' from its module interface; the compiler that produced it, 'Apple Swift version 5.3.2 (swiftlang-1200.0.45 clang-1200.0.32.28)', may have used features that aren't supported by this compiler, 'Apple Swift version 5.3 (swiftlang-1200.0.29.2 clang-1200.0.30.1)
複製代碼
按理說有了 swiftinterface
應該不會出現編譯不兼容問題了,但仍是出現了,雖然提示內容有些不太同樣,這裏會多出一個內部依賴庫的問題。這裏查看對應版本的 swiftinterface
文件:
// swift-interface-format-version: 1.0
// swift-compiler-version: Apple Swift version 5.3.2 (swiftlang-1200.0.45 clang-1200.0.32.28)
// swift-module-flags: -target arm64-apple-ios10.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -Onone -module-name ZYModule
import Foundation
import SnapKit
import Swift
import UIKit
複製代碼
這裏除了聲明編譯器信息外,還把依賴庫 SnapKit 也寫入了進去,因此這裏猜想的隱含邏輯就是二進制庫作了 Build Libraries for Distribution
,其依賴的其餘庫也綁定了對應的編譯器版本信息,在工程裏使用源碼編譯的 SnapKit 對於了其當前編譯版本(5.3),與二進制庫所生成的版本(5.3.2)不一致,因此才致使了該問題。我嘗試修改項目裏 Pod庫 的 Build Libraries for Distribution
選項:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
end
end
end
複製代碼
問題獲得解決,編譯經過!
整理編輯:師大小海騰,zhangferry
BIOS 全稱爲 Basic Input Output System,即基本輸入輸出系統。BIOS 是預先內置在計算機主機內部的程序,也是計算機開機後加載的第一個程序。BIOS 保存着計算機最重要的基本輸入輸出的程序、開機後自檢程序和系統自啓動程序,它可從 CMOS(是電腦主板上的一塊可讀寫的 RAM 芯片)中讀寫系統設置的具體信息。
BIOS 除了鍵盤,磁盤,顯卡等基本控制程序外,還有引導程序
的功能。引導程序是存儲在啓動驅動器起始區域的小程序,操做系統的啓動驅動器通常是硬盤。不過有時也多是 CD-ROM 或軟盤。
電腦開機後,BIOS 會確認硬件是否正常運行,沒有異常的話就會直接啓動引導程序,引導程序的功能就是把在硬盤等記錄的 OS 加載到內存中運行,雖然啓動應用是 OS 的功能,但 OS 不能夠本身啓動本身,而是經過引導程序來啓動。
製做黑蘋果的時候安裝的 Clover 就是一個啓動程序,它經過修改 BIOS 配置,讓 BIOS 首先執行它,而後由它來引導至 MacOS 的啓動。
嚴格意義來講 BIOS 是 IBM PC架構上的一種設計規範,Mac電腦,包括一些新型的主板都沒有 BIOS 這一律念,取而代之的是 EFI/UEFI。
彙編語言(Assembly Language)是任何一種用於電子計算機、微處理器、微控制器或其餘可編程器件的低級語言,亦稱爲符號語言。在彙編語言中,用助記符代替機器指令的操做碼,用地址符號或標號代替指令或操做數的地址。在不一樣的設備中,彙編語言對應着不一樣的機器語言指令集,經過彙編過程轉換成機器指令。特定的彙編語言和特定的機器語言指令集是一一對應的,不一樣平臺之間不可直接移植。
彙編語言比機器語言的可讀性要好,但跟高級語言比較而言,可讀性仍是較差。不過採用它編寫的程序具備存儲空間佔用少、執行速度快的特色,這些是高級語言所沒法取代的。在實際應用中,是否使用匯編語言,取決於具體應用要求、開發時間和質量等方面做權衡。彙編經常使用的指令以下:
操做碼 | 操做數 | 功能 |
---|---|---|
mov | A, B | 把B的值賦給A |
and | A, B | 把A和B同時相加,並把結果賦給A |
push | A | 把A的值存儲在棧中 |
pop | A | 從棧中讀出值,並將其賦值給A |
call | A | 調用函數A |
ret | 無 | 處理返回給調用源函數 |
虛擬機(Virtual Machine)是指經過軟件模擬的具備完整硬件系統功能的、運行在一個徹底隔離環境中的完整計算機系統。在實體計算機中可以完成的工做在虛擬機中都可以實現。在計算機中建立虛擬機時,須要將實體機的部分硬盤和內存容量做爲虛擬機的硬盤和內存容量。每一個虛擬機都有獨立的 CMOS、硬盤和操做系統,能夠像使用實體機同樣對虛擬機進行操做。
虛擬機的主要用處有:
虛擬機目前可分爲三類:
IRQ(Interrupt Request)表明的就是中斷請求。IRQ 是用來暫停當前正在運行的程序,並跳轉到其餘程序運行的必要機制。該機制被稱爲處理中斷。中斷處理在硬件控制中擔當着重要的角色。由於若是沒有中斷處理,就有可能沒法順暢進行處理的狀況。
從中斷處理開始到請求中斷的程序(中斷處理程序)運行結束以前,被中斷的程序(主程序)的處理是中止的。這種狀況就相似於在處理文檔的過程當中有電話打進來,電話就至關因而中斷處理。假如沒有中斷處理的發生,就必須等到文檔處理完成後纔可以接聽電話。因而可知,中斷處理有着巨大的價值,就像是接聽完電話後會返回原來的文檔做業同樣,中斷程序處理完成後,也會返回到主程序中繼續。
實施中斷請求的是鏈接外圍設備的 I/O 控制器,負責實施中斷處理的是 CPU。
假若有多個外圍設備進行中斷請求的話, CPU 須要作出選擇進行處理,爲此,咱們能夠在 I/O 控制器和 CPU 中間加入名爲中斷控制器的 IC 來進行緩衝。中斷控制器會把從多個外圍設備發出的中斷請求有序的傳遞給 CPU。中斷控制器的功能至關於就是緩衝。下面是中斷控制器功能的示意圖
DMA 全稱爲 Direct Memory Access,即直接存儲器訪問。DMA 是一種內存訪問機制,它是指在不經過 CPU 的狀況下,外圍設備直接和主存進行數據傳輸。磁盤等硬件設備都用到了 DMA 機制,經過 DMA,大量數據就能夠在短期內實現傳輸,之因此這麼快,是由於 CPU 做爲中介的時間被節省了,下面是 DMA 的傳輸過程
I/O 端口號、IRQ、DMA 通道能夠說是識別外圍設備的 3 點組合。不過,IRQ、DMA 通道並非全部外圍設備都具有的。計算機主機經過軟件控制硬件時所須要的信息的最低限,是外圍設備的 I/O 端口號。IRQ 只對須要中斷處理的外圍設備來講是必須的,DMA 通道則只對須要 DMA 機制的外圍設備來講必須的。
整理編輯:皮拉夫大王在此
本期博客彙總的主題是 watchdog
一、iOS watchdog (看門狗機制) -- 來自簡書:Mr_Xie
先來簡單瞭解什麼是 watchdog。
二、iOS App 後臺任務的坑 -- 來自cocoachina :米米狗
後臺任務泄漏是致使觸發 watchdog 常見狀況之一,還有一種狀況就是主線程卡死,文章中有介紹如何區分。
三、Addressing Watchdog Terminations
蘋果的官方文檔。對我我的而言,瞭解 scene-create 和 scene-update 的含義在排查問題過程當中起到了必定的做用。
進入實踐階段,其實咱們不多真的在主線程作大量耗時操做如網絡請求等。觸發 watchdog 每每是不經意的,甚至你不會懷疑你的代碼有任何問題。這篇文章介紹的是 58 同城團隊如何定位到剪切板形成的啓動卡死。
這篇文章是字節跳動 APM 團隊早些時候發表的,是業界少有的公開介紹卡死崩潰的緣由的文章,具備很強的借鑑意義。咱們在作啓動卡死優化的過程當中,文中提到的相關問題基本都有遇到,只不過在此以前並不知道什麼緣由以及如何解決。因此說若是你想作卡死治理,能夠參考下這篇文章。
六、面試過 500+ 位候選人以後,想談談面試官視角的一些期待
《iOS 穩定性問題治理:卡死崩潰監控原理及最佳實踐》的做者在面試了 500+ 候選人後寫的文章,有須要的同窗能夠針對性的作些準備。
@iHTCboy:從辯論的視角分析 iOS 安全性,同時與 macOS 安全性進行對比,提出了讓 iOS 更加安全的建議,文中同時也總結了很是多 iOS 和 macOS 安全技術小知識,可讓你們在短期裏快速入門和重溫 Apple OS 安全性知識點。
整理編輯:Mimosa
喵神關於 async-swift
的書開工了。是關於Swift5.5的新特性協程,待書籍完工的第一時間咱們會經過週報再通知到你們。
該網站的口號是:「能找到知足你全部開發需求的代碼片斷!」,他有許多語言的經常使用代碼片斷(Code Snippets),例如排序算法、hex 轉 rgb、時間轉換等等,能讓你輕鬆地找到各個語言的這些經常使用代碼,讓你的開發效率大大提高!(惋惜目前尚未 Swift
的板塊🥲
整理編輯:zhangferry
軟件狀態:基礎功能免費,高級功能付費
使用介紹
Whatpulse是一個電腦使用檢測統計軟件,它能夠統計你天天的鍵盤、鼠標、網絡等狀況的使用詳情並將其作成簡單的統計表格,用於分析天天的電腦使用狀況。
翻到一張以前公司電腦使用該軟件將近一年的留存成果,100萬+ 按鍵次數,使用最多的居然是刪除鍵。。
地址:konsomejona.github.io/OctoMouse/i…
軟件狀態:免費,開源
使用介紹
該軟件主要用於統計鍵盤及鼠標的行爲信息,比較有意思的是,它對鼠標的統計會包含移動距離參數。能夠試試看多久才能讓鼠標移動 5km。