iOS摸鱼周报 第二十四期
本期概要
-
話題:跟一位同學聊一下最近的面試感受。
-
Tips:設計 OC 版本的 defer 功能,使用現有證書創建 Fastlane match 格式加密文件。
-
面試模塊:離屏渲染相關知識點。
-
優秀博客:整理了Swift 閉包相關的文章。
-
學習資料:介紹兩個倉庫,一個是大家容易讀錯的開發詞匯匯總,一個是微軟出品的物聯網課程。
-
開發工具:一款免費開源的跨平臺密碼管理工具:KeeWeb。
本期話題
@zhangferry:本期訪談對象是 @七里香蛋炒飯,他也是交流群里的小伙伴。了解到他最近剛換工作,從某小公司入職某一線大廠,就邀請他來聊一聊面試的一些感想。
zhangferry:你面試準備了多久,大概的面試經歷是怎樣的?
整個面試過程大概有一個半月時間,前期是斷斷續續在看一些東西,后面有 3 周左右時間是重點準備。接到面邀的比較多,有些不感興趣的就沒去,實際參與面試的有 10 家,也都是一二線互聯網公司。這側面也說明了 iOS 沒人要僅僅是個調侃而已,目前對 iOS 開發的需求還是不少的。
zhangferry:結合這些面試經歷,有哪些高頻題?遇到的算法考察多嗎?
高頻題的話內存管理和多線程肯定算是了,基本上每家面試都會問的。
另一個就是項目經歷,也是必問的。這個一般會結合簡歷來問,特別是項目重點和難點,所以大家準備簡歷的時候一定要保證對所寫的內容是很清楚的。對于非常喜歡的公司還可以根據他們業務需求有針對性的優化下簡歷。
另外,架構設計能力,封裝能力,有時也會考察,這個短時間無法快速提升,需要平常工作過程有意培養一下。
算法的考察整體來看不算多,大概有 30% 的概率吧。那些考算法的也都是考察比較簡單的題目,也可能跟我面試的崗位有關,這個僅供參考,面試之前,算法方面多少還是要準備的。
zhangferry:現在經常有人說面試八股文,結合面試經歷,你怎么看待八股文這個事?
首先存在即合理吧,八股文的現象體現的是面試官自身準備的不足。可能來源于早期,大家技術水平都一般,沒有太多可問的東西,也沒有特意研究過哪些方面,所以就網上扒一扒拿來問。目前的經歷來看到還好,被問的問題還算多元,可能這種現象之后會隨著面試官水平的提升越來越少。
同時這也算是一種雙向選擇,如果某次面試全是那種眼熟的問題,毫無新意,大概率可以說明這家公司對技術的重視和鉆研程度不高,可以降低其優先級。
zhangferry:對待參加面試的小伙伴有沒有什么建議?
投遞簡歷沒有回復或者面試感覺還可以最后卻沒過,出現這些現象是有多種原因,比如崗位正好招滿了、崗位需求有變等等,不要首先否定自己。面試過程一定要放平心態,不要有心理壓力。
最后祝所有準備找和正在找工作的小伙伴都能拿到滿意的 Offer。
開發Tips
在 Objective-C 中實現 Swift 中的 defer 功能
整理編輯:RunsCode、zhangferry
期望效果是下面這樣,函數執行完出棧之前,要執行 defer 內定義的內容。
-?(void)hello:(NSString?*)str?{defer?{//?do?something} }準備工作
實現 defer 的前提是需要有指令能夠讓函數在作用域出棧的時候觸發 defer 里的閉包內容,這里需要用到兩個東西:
__attribute__ :一個用于在聲明時指定一些特性的編譯器指令,它可以讓我們進行更多的錯誤檢查和高級優化工作。
想了解更多,參考:https://nshipster.cn/attribute/
cleanup(...):接受一個函數指針,在作用域結束的時候觸發該函數指針。
簡單實踐
到這一步,我們已經了解了大概功能了,那我們實戰一下:
#include?<stdlib.h> #include?<stdio.h>void?free_buffer(char?**buffer)?{?printf("3.?free?buffer\n");?} void?delete_file(int?*value)?{?printf("2.?delete?file\n");?} void?close_file(FILE?**fp)?{?printf("1.?close?file?\n");?}int?main(int?argc,?char?**argv)?{//?執行順序與壓棧順序相反char?*buffer?__attribute__?((__cleanup__(free_buffer)))?=?malloc(20);int?res?__attribute__?((__cleanup__(delete_file)));FILE?*fp?__attribute__?((__cleanup__(close_file)));printf("0.?open?file?\n");return?0; }輸出結果:
0.?open?file? 1.?close?file? 2.?delete?file 3.?free?buffer [Finished?in?683ms]但是到這一步的話,我們使用不方便啊,何況我們還是 iOSer,這個不友好啊。那么繼續改造成 Objective-C 獨有版本。
實戰優化
要做到上面那個理想方案,還需要什么呢?
- 代碼塊,那就只能是 NSBlock
- 宏函數 or 全局函數?想到 Objective-C 又沒有尾隨閉包這一說,那全局函數肯定不行,也就只能全局宏了
OK 大功告成跑一下
defer?{NSLog(@"defer?1"); }; defer?{?//?error:?Redefinition?of?'blk'NSLog(@"defer?2"); }; defer?{?//?error:?Redefinition?of?'blk'NSLog(@"defer?3"); }; NSLog(@"beign?defer");不好意思, 不行,報錯 error: Redefinition of 'blk',為什么?(想一想)
上最終解決版本之前還得認識兩個東西
-
__LINE__ :獲取當前行號
-
## :連接兩個字符
最終方案
好了,差不多了, 是時候展示真功夫了
#define?defer_concat_(A,?B)?A?##?B #define?defer_concat(A,?B)?defer_concat_(A,?B)typedef?void(^executeCleanupBlock)(void);#if?defined(__cplusplus) extern?"C"?{ #endif void?deferFunction?(__strong?executeCleanupBlock?_Nonnull?*_Nonnull?block); #if?defined(__cplusplus) } #endif#ifndef?defer #define?defer?\ __strong?executeCleanupBlock?defer_concat(blk,?__LINE__)?__attribute__((cleanup(deferFunction),?unused))?=?^ #endif //?.m?文件 void?deferFunction?(__strong?executeCleanupBlock?*block)?{(*block)(); }總共就這么多代碼,實現 OC 版本的 defer。
其實到了這里已經結束了, 但是還要講一句:這里與 Justin Spahr-Summers 在 libextobj[1] (@onExit{})里的實現略有差異,當前實現更簡單,libextobj 里的功能更豐富一些。
使用現有證書創建 Fastlane match 格式加密文件
簡單說下 match 管理證書的工作流程,它將證書文件進行加密存放到 git 倉庫,使用方 clone 這個倉庫然后解密證書文件,再把證書安裝到本機的 keychain 里。這樣不同設備上就可以愉快的共享證書了。
match 創建證書有兩種方式:
-
fastlane match nuke,對原證書 revoke 重新生成一份新的,這會導致原證書不可用,如果多 App 賬號,不建議這樣。
-
通過已有證書導出為 match 格式加密文件,進行維護。
第二種方案不會影響原證書使用,比較推薦。但是看網上介紹這種方案的非常少,所以還是簡單總結下:
1、導出文件
需要導出證書、p12 兩個文件,將他們放到一個特定文件夾,假定他們的命名分別為:cert.cer、cert.p12。
2、使用 openssl 進行加密
需要一個預設密碼,這個可以自定義,作為加密和解密的一個特定參數。
$?openssl?enc?-aes-256-cbc?-k?{password}?-in?"cert.cer"?-out?"cert.enc.cer"?-a?-e?-salt $?openssl?enc?-aes-256-cbc?-k?{password}?-in?"cert.p12"?-out?"cert.enc.p12"?-a?-e?-salt3、推送證書到 git 倉庫
每個證書文件都有特定的 ID,推送之前我們還需要修改加密證書的文件名。該 ID 在開發者網站證書詳情那一頁的網址最后面展示。就是下面碼糊住的那一塊:
然后我們將那兩個文件放到 git 倉庫的 certs 目錄對應的類型(development/distribution)下,然后進行推送。
4、使用
還記得我們上面設計的加密參數嗎,在使用的時候也是需要用到的,我們將其放到 .env 這個文件中作為全局變量,它有一個特定的變量名 MATCH_PASSWROD。使用的時候用下面的語句就可以下載安裝證書了:
$?fastlane?match?development $?fastlane?match?adhoc參考:https://docs.fastlane.tools/actions/match/
面試解析
整理編輯:FBY展菲
本期面試解析講解的是離屏渲染的相關知識點。
為什么圓角和裁剪后 iOS 繪制會觸發離屏渲染?
默認情況下每個視圖都是完全獨立繪制渲染的。而當某個父視圖設置了圓角和裁剪并且又有子視圖時,父視圖只會對自身進行裁剪繪制和渲染。
當子視圖繪制時就要考慮被父視圖裁剪部分的繪制渲染處理,因此需要反復遞歸回溯和拷貝父視圖的渲染上下文和裁剪信息,再和子視圖做合并處理,以便完成最終的裁剪效果。這樣勢必產生大量的時間和內存的開銷。
解決的方法是當父視圖被裁剪和有圓角并且有子視圖時,就單獨的開辟一塊繪制上下文,把自身和所有子視圖的內容都統一繪制在這個上下文中,這樣子視圖也不需要再單獨繪制了,所有裁剪都會統一處理。當父視圖繪制完成時再將開辟的緩沖上下文拷貝到屏幕上下文中去。這個過程就是離屏渲染!!
所以離屏渲染其實和我們先將內容繪制在位圖內存上下文然后再統一拷貝到屏幕上下文中的雙緩存技術是非常相似的。使用離屏渲染主要因為 iOS 內部的視圖獨立繪制技術所導致的一些缺陷而不得不才用的技術。
推薦閱讀:關于iOS離屏渲染的深入研究[2]
優秀博客
整理編輯:皮拉夫大王在此、FBY展菲
本期主題:Swift 閉包
1、Swift 基于閉包的類型擦除 – 來自公眾號:Swift社區
本文重點介紹在 Swift 中處理泛型時可能發生的一種情況,以及通常是如何使用基于閉包的類型擦除技術來解決這種情況。
2、swift 閉包(閉包表達式、尾隨閉包、逃逸閉包、自動閉包)[3] – 來自掘金:NewBoy
關于 Swift 閉包的初級文章,內容整合了幾乎所有 Swift 閉包的概念和用法。比較適合 Swift 初學者或者是從 OC 轉向 Swift 的同學。
3、Day6 - Swift 閉包詳解 上 – 來自微信公眾號:iOS成長指北
4、Day7 - Swift 閉包詳解 下 – 來自微信公眾號:iOS成長指北
Swift 閉包學習的兩篇文章,也是包含了 Swift 的概念及用法,其中部分用法及概念更加細致。兩篇文章是作者學習思考再輸出的成果,因此在文章中有些作者的理解,這對我們學習是比較重要的,而且比較通俗易懂。
5、Closures[4] – 來自:Swift Document
@zhangferry:對于概念的理解官方文檔還是非常有必要看的。Swift 里的閉包跟 C/OC 中的 Block,其他語言中的 Lambda 含義是類似的。Swift 與 OC 混編時,閉包與 Block 是完全兼容的。但就含義來說兩者仍有區別,Block 更多強調的是匿名代碼塊,閉包則是除這之外還有真正的一級對象的含義。
學習資料
整理編輯:Mimosa
中國程序員容易發音錯誤的單詞
地址:https://github.com/shimohq/chinese-programmer-wrong-pronunciation
在擔心和同事討論代碼的時候念的單詞同事聽不懂?開會 review 代碼的時候突然遇到不會讀的單詞?如果你遇到過這些問題,那來看看這個 github 倉庫吧。它是一個收錄了在編程領域容易發音錯誤單詞的倉庫,目前已經有 14.4k stars 了,他標注出了易錯的讀音和正確的讀音,且支持在線聽讀音。
IoT for Beginners
地址:https://github.com/microsoft/IoT-For-Beginners
這是來自微軟 Azure 的物聯網課程,是一個為期 12 周的 24 課時的課程,其中有所有關于物聯網的基礎知識,每節課都包括課前和課后測驗、完成課程的書面說明、解決方案、作業等。其中每個項目都是適合學生或業余愛好者的、在真實世界可用的硬件,且每個項目都會提供相關的背景知識來研究具體的項目領域。
工具推薦
整理編輯:zhangferry
KeeWeb
地址:https://keeweb.info/
軟件狀態:免費,開源
軟件介紹:
KeeWeb 是一個瀏覽器和桌面密碼管理器,兼容 KeePass 數據庫。它不需要任何服務器或額外的資源。該應用程序可以在瀏覽器中運行,也可以作為桌面應用程序運行。更重要的是它還可以利用 Dropbox、Google ?Drive 進行遠程同步。
關于我們
iOS 摸魚周報,主要分享開發過程中遇到的經驗教訓、優質的博客、高質量的學習資料、實用的開發工具等。周報倉庫在這里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的內容推薦可以通過 issue 的方式進行提交。另外也可以申請成為我們的常駐編輯,一起維護這份周報。另可關注公眾號:iOS成長之路,后臺點擊進群交流,聯系我們,獲取更多內容。
往期推薦
iOS摸魚周報 第二十三期
iOS摸魚周報 第二十二期
iOS摸魚周報 第二十一期
iOS摸魚周報 第二十期
iOS成長之路
主要專注于 iOS 領域,也會分享一些關于成長和讀書的感悟。目前在跟一群可愛的小伙伴一起維護 iOS 摸魚周報,周報為聚合內容,既有對于日常開發的總結,也會整理收集一些非常棒的學習資料和文章。
54篇原創內容
公眾號
參考資料
[1]
libextobj: https://github.com/jspahrsummers/libextobjc/blob/master/extobjc/EXTScope.h
[2]
關于iOS離屏渲染的深入研究: https://zhuanlan.zhihu.com/p/72653360
[3]
swift 閉包(閉包表達式、尾隨閉包、逃逸閉包、自動閉包): https://juejin.cn/post/6972560642427486238
[4]
Apple Document - Closures: https://docs.swift.org/swift-book/LanguageGuide/Closures.html
總結
以上是生活随笔為你收集整理的iOS摸鱼周报 第二十四期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 亚马逊商城评论数据分析与可视化(KNN预
- 下一篇: 微分流形与黎曼几何学习笔记(转)