日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

iOS摸鱼周报 第二十四期

發(fā)布時(shí)間:2023/12/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS摸鱼周报 第二十四期 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本期概要

  • 話題:跟一位同學(xué)聊一下最近的面試感受。

  • Tips:設(shè)計(jì) OC 版本的 defer 功能,使用現(xiàn)有證書創(chuàng)建 Fastlane match 格式加密文件。

  • 面試模塊:離屏渲染相關(guān)知識(shí)點(diǎn)。

  • 優(yōu)秀博客:整理了Swift 閉包相關(guān)的文章。

  • 學(xué)習(xí)資料:介紹兩個(gè)倉(cāng)庫(kù),一個(gè)是大家容易讀錯(cuò)的開發(fā)詞匯匯總,一個(gè)是微軟出品的物聯(lián)網(wǎng)課程。

  • 開發(fā)工具:一款免費(fèi)開源的跨平臺(tái)密碼管理工具:KeeWeb。

本期話題

@zhangferry:本期訪談對(duì)象是 @七里香蛋炒飯,他也是交流群里的小伙伴。了解到他最近剛換工作,從某小公司入職某一線大廠,就邀請(qǐng)他來(lái)聊一聊面試的一些感想。

zhangferry:你面試準(zhǔn)備了多久,大概的面試經(jīng)歷是怎樣的?

整個(gè)面試過(guò)程大概有一個(gè)半月時(shí)間,前期是斷斷續(xù)續(xù)在看一些東西,后面有 3 周左右時(shí)間是重點(diǎn)準(zhǔn)備。接到面邀的比較多,有些不感興趣的就沒(méi)去,實(shí)際參與面試的有 10 家,也都是一二線互聯(lián)網(wǎng)公司。這側(cè)面也說(shuō)明了 iOS 沒(méi)人要僅僅是個(gè)調(diào)侃而已,目前對(duì) iOS 開發(fā)的需求還是不少的。

zhangferry:結(jié)合這些面試經(jīng)歷,有哪些高頻題?遇到的算法考察多嗎?

高頻題的話內(nèi)存管理和多線程肯定算是了,基本上每家面試都會(huì)問(wèn)的。

另一個(gè)就是項(xiàng)目經(jīng)歷,也是必問(wèn)的。這個(gè)一般會(huì)結(jié)合簡(jiǎn)歷來(lái)問(wèn),特別是項(xiàng)目重點(diǎn)和難點(diǎn),所以大家準(zhǔn)備簡(jiǎn)歷的時(shí)候一定要保證對(duì)所寫的內(nèi)容是很清楚的。對(duì)于非常喜歡的公司還可以根據(jù)他們業(yè)務(wù)需求有針對(duì)性的優(yōu)化下簡(jiǎn)歷。

另外,架構(gòu)設(shè)計(jì)能力,封裝能力,有時(shí)也會(huì)考察,這個(gè)短時(shí)間無(wú)法快速提升,需要平常工作過(guò)程有意培養(yǎng)一下。

算法的考察整體來(lái)看不算多,大概有 30% 的概率吧。那些考算法的也都是考察比較簡(jiǎn)單的題目,也可能跟我面試的崗位有關(guān),這個(gè)僅供參考,面試之前,算法方面多少還是要準(zhǔn)備的。

zhangferry:現(xiàn)在經(jīng)常有人說(shuō)面試八股文,結(jié)合面試經(jīng)歷,你怎么看待八股文這個(gè)事?

首先存在即合理吧,八股文的現(xiàn)象體現(xiàn)的是面試官自身準(zhǔn)備的不足。可能來(lái)源于早期,大家技術(shù)水平都一般,沒(méi)有太多可問(wèn)的東西,也沒(méi)有特意研究過(guò)哪些方面,所以就網(wǎng)上扒一扒拿來(lái)問(wèn)。目前的經(jīng)歷來(lái)看到還好,被問(wèn)的問(wèn)題還算多元,可能這種現(xiàn)象之后會(huì)隨著面試官水平的提升越來(lái)越少。

同時(shí)這也算是一種雙向選擇,如果某次面試全是那種眼熟的問(wèn)題,毫無(wú)新意,大概率可以說(shuō)明這家公司對(duì)技術(shù)的重視和鉆研程度不高,可以降低其優(yōu)先級(jí)。

zhangferry:對(duì)待參加面試的小伙伴有沒(méi)有什么建議?

投遞簡(jiǎn)歷沒(méi)有回復(fù)或者面試感覺還可以最后卻沒(méi)過(guò),出現(xiàn)這些現(xiàn)象是有多種原因,比如崗位正好招滿了、崗位需求有變等等,不要首先否定自己。面試過(guò)程一定要放平心態(tài),不要有心理壓力。

最后祝所有準(zhǔn)備找和正在找工作的小伙伴都能拿到滿意的 Offer。

開發(fā)Tips

在 Objective-C 中實(shí)現(xiàn) Swift 中的 defer 功能

整理編輯:RunsCode、zhangferry

期望效果是下面這樣,函數(shù)執(zhí)行完出棧之前,要執(zhí)行 defer 內(nèi)定義的內(nèi)容。

-?(void)hello:(NSString?*)str?{defer?{//?do?something} }
準(zhǔn)備工作

實(shí)現(xiàn) defer 的前提是需要有指令能夠讓函數(shù)在作用域出棧的時(shí)候觸發(fā) defer 里的閉包內(nèi)容,這里需要用到兩個(gè)東西:

__attribute__ :一個(gè)用于在聲明時(shí)指定一些特性的編譯器指令,它可以讓我們進(jìn)行更多的錯(cuò)誤檢查和高級(jí)優(yōu)化工作。

想了解更多,參考:https://nshipster.cn/attribute/

cleanup(...):接受一個(gè)函數(shù)指針,在作用域結(jié)束的時(shí)候觸發(fā)該函數(shù)指針。

簡(jiǎn)單實(shí)踐

到這一步,我們已經(jīng)了解了大概功能了,那我們實(shí)戰(zhàn)一下:

#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)?{//?執(zhí)行順序與壓棧順序相反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; }

輸出結(jié)果:

0.?open?file? 1.?close?file? 2.?delete?file 3.?free?buffer [Finished?in?683ms]

但是到這一步的話,我們使用不方便啊,何況我們還是 iOSer,這個(gè)不友好啊。那么繼續(xù)改造成 Objective-C 獨(dú)有版本。

實(shí)戰(zhàn)優(yōu)化

要做到上面那個(gè)理想方案,還需要什么呢?

  • 代碼塊,那就只能是 NSBlock
typedef?void(^executeCleanupBlock)(void);
  • 宏函數(shù) or 全局函數(shù)?想到 Objective-C 又沒(méi)有尾隨閉包這一說(shuō),那全局函數(shù)肯定不行,也就只能全局宏了
#ifndef?defer #define?defer?\ __strong?executeCleanupBlock?blk?__attribute__((cleanup(deferFunction),?unused))?=?^ #endif ... //?.m?文件 void?deferFunction?(__strong?executeCleanupBlock?*block)?{(*block)(); }

OK 大功告成跑一下

defer?{NSLog(@"defer?1"); }; defer?{?//?error:?Redefinition?of?'blk'NSLog(@"defer?2"); }; defer?{?//?error:?Redefinition?of?'blk'NSLog(@"defer?3"); }; NSLog(@"beign?defer");

不好意思, 不行,報(bào)錯(cuò) error: Redefinition of 'blk',為什么?(想一想)

上最終解決版本之前還得認(rèn)識(shí)兩個(gè)東西

  • __LINE__ :獲取當(dāng)前行號(hào)

  • ## :連接兩個(gè)字符

#define?defer_concat_(A,?B)?A?##?B #define?defer_concat(A,?B)?defer_concat_(A,?B) ... //?為什么要多一個(gè)下劃線的宏,?這是因?yàn)槊看沃荒苷归_一個(gè)宏,?__LINE__?的正確行號(hào)在第二層才能被解開

最終方案

好了,差不多了, 是時(shí)候展示真功夫了

#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)(); }

總共就這么多代碼,實(shí)現(xiàn) OC 版本的 defer。

其實(shí)到了這里已經(jīng)結(jié)束了, 但是還要講一句:這里與 Justin Spahr-Summers 在 libextobj[1] (@onExit{})里的實(shí)現(xiàn)略有差異,當(dāng)前實(shí)現(xiàn)更簡(jiǎn)單,libextobj 里的功能更豐富一些。

使用現(xiàn)有證書創(chuàng)建 Fastlane match 格式加密文件

簡(jiǎn)單說(shuō)下 match 管理證書的工作流程,它將證書文件進(jìn)行加密存放到 git 倉(cāng)庫(kù),使用方 clone 這個(gè)倉(cāng)庫(kù)然后解密證書文件,再把證書安裝到本機(jī)的 keychain 里。這樣不同設(shè)備上就可以愉快的共享證書了。

match 創(chuàng)建證書有兩種方式:

  • fastlane match nuke,對(duì)原證書 revoke 重新生成一份新的,這會(huì)導(dǎo)致原證書不可用,如果多 App 賬號(hào),不建議這樣。

  • 通過(guò)已有證書導(dǎo)出為 match 格式加密文件,進(jìn)行維護(hù)。

第二種方案不會(huì)影響原證書使用,比較推薦。但是看網(wǎng)上介紹這種方案的非常少,所以還是簡(jiǎn)單總結(jié)下:

1、導(dǎo)出文件

需要導(dǎo)出證書、p12 兩個(gè)文件,將他們放到一個(gè)特定文件夾,假定他們的命名分別為:cert.cer、cert.p12。

2、使用 openssl 進(jìn)行加密

需要一個(gè)預(yù)設(shè)密碼,這個(gè)可以自定義,作為加密和解密的一個(gè)特定參數(shù)。

$?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?-salt

3、推送證書到 git 倉(cāng)庫(kù)

每個(gè)證書文件都有特定的 ID,推送之前我們還需要修改加密證書的文件名。該 ID 在開發(fā)者網(wǎng)站證書詳情那一頁(yè)的網(wǎng)址最后面展示。就是下面碼糊住的那一塊:

然后我們將那兩個(gè)文件放到 git 倉(cāng)庫(kù)的 certs 目錄對(duì)應(yīng)的類型(development/distribution)下,然后進(jìn)行推送。

4、使用

還記得我們上面設(shè)計(jì)的加密參數(shù)嗎,在使用的時(shí)候也是需要用到的,我們將其放到 .env 這個(gè)文件中作為全局變量,它有一個(gè)特定的變量名 MATCH_PASSWROD。使用的時(shí)候用下面的語(yǔ)句就可以下載安裝證書了:

$?fastlane?match?development $?fastlane?match?adhoc

參考:https://docs.fastlane.tools/actions/match/

面試解析

整理編輯:FBY展菲

本期面試解析講解的是離屏渲染的相關(guān)知識(shí)點(diǎn)。

為什么圓角和裁剪后 iOS 繪制會(huì)觸發(fā)離屏渲染?

默認(rèn)情況下每個(gè)視圖都是完全獨(dú)立繪制渲染的。而當(dāng)某個(gè)父視圖設(shè)置了圓角和裁剪并且又有子視圖時(shí),父視圖只會(huì)對(duì)自身進(jìn)行裁剪繪制和渲染。

當(dāng)子視圖繪制時(shí)就要考慮被父視圖裁剪部分的繪制渲染處理,因此需要反復(fù)遞歸回溯和拷貝父視圖的渲染上下文和裁剪信息,再和子視圖做合并處理,以便完成最終的裁剪效果。這樣勢(shì)必產(chǎn)生大量的時(shí)間和內(nèi)存的開銷。

解決的方法是當(dāng)父視圖被裁剪和有圓角并且有子視圖時(shí),就單獨(dú)的開辟一塊繪制上下文,把自身和所有子視圖的內(nèi)容都統(tǒng)一繪制在這個(gè)上下文中,這樣子視圖也不需要再單獨(dú)繪制了,所有裁剪都會(huì)統(tǒng)一處理。當(dāng)父視圖繪制完成時(shí)再將開辟的緩沖上下文拷貝到屏幕上下文中去。這個(gè)過(guò)程就是離屏渲染!!

所以離屏渲染其實(shí)和我們先將內(nèi)容繪制在位圖內(nèi)存上下文然后再統(tǒng)一拷貝到屏幕上下文中的雙緩存技術(shù)是非常相似的。使用離屏渲染主要因?yàn)?iOS 內(nèi)部的視圖獨(dú)立繪制技術(shù)所導(dǎo)致的一些缺陷而不得不才用的技術(shù)。

推薦閱讀:關(guān)于iOS離屏渲染的深入研究[2]

優(yōu)秀博客

整理編輯:皮拉夫大王在此、FBY展菲

本期主題:Swift 閉包

1、Swift 基于閉包的類型擦除 – 來(lái)自公眾號(hào):Swift社區(qū)

本文重點(diǎn)介紹在 Swift 中處理泛型時(shí)可能發(fā)生的一種情況,以及通常是如何使用基于閉包的類型擦除技術(shù)來(lái)解決這種情況。

2、swift 閉包(閉包表達(dá)式、尾隨閉包、逃逸閉包、自動(dòng)閉包)[3] – 來(lái)自掘金:NewBoy

關(guān)于 Swift 閉包的初級(jí)文章,內(nèi)容整合了幾乎所有 Swift 閉包的概念和用法。比較適合 Swift 初學(xué)者或者是從 OC 轉(zhuǎn)向 Swift 的同學(xué)。

3、Day6 - Swift 閉包詳解 上 – 來(lái)自微信公眾號(hào):iOS成長(zhǎng)指北

4、Day7 - Swift 閉包詳解 下 – 來(lái)自微信公眾號(hào):iOS成長(zhǎng)指北

Swift 閉包學(xué)習(xí)的兩篇文章,也是包含了 Swift 的概念及用法,其中部分用法及概念更加細(xì)致。兩篇文章是作者學(xué)習(xí)思考再輸出的成果,因此在文章中有些作者的理解,這對(duì)我們學(xué)習(xí)是比較重要的,而且比較通俗易懂。

5、Closures[4] – 來(lái)自:Swift Document

@zhangferry:對(duì)于概念的理解官方文檔還是非常有必要看的。Swift 里的閉包跟 C/OC 中的 Block,其他語(yǔ)言中的 Lambda 含義是類似的。Swift 與 OC 混編時(shí),閉包與 Block 是完全兼容的。但就含義來(lái)說(shuō)兩者仍有區(qū)別,Block 更多強(qiáng)調(diào)的是匿名代碼塊,閉包則是除這之外還有真正的一級(jí)對(duì)象的含義。

學(xué)習(xí)資料

整理編輯:Mimosa

中國(guó)程序員容易發(fā)音錯(cuò)誤的單詞

地址:https://github.com/shimohq/chinese-programmer-wrong-pronunciation

在擔(dān)心和同事討論代碼的時(shí)候念的單詞同事聽不懂?開會(huì) review 代碼的時(shí)候突然遇到不會(huì)讀的單詞?如果你遇到過(guò)這些問(wèn)題,那來(lái)看看這個(gè) github 倉(cāng)庫(kù)吧。它是一個(gè)收錄了在編程領(lǐng)域容易發(fā)音錯(cuò)誤單詞的倉(cāng)庫(kù),目前已經(jīng)有 14.4k stars 了,他標(biāo)注出了易錯(cuò)的讀音和正確的讀音,且支持在線聽讀音。

IoT for Beginners

地址:https://github.com/microsoft/IoT-For-Beginners

這是來(lái)自微軟 Azure 的物聯(lián)網(wǎng)課程,是一個(gè)為期 12 周的 24 課時(shí)的課程,其中有所有關(guān)于物聯(lián)網(wǎng)的基礎(chǔ)知識(shí),每節(jié)課都包括課前和課后測(cè)驗(yàn)、完成課程的書面說(shuō)明、解決方案、作業(yè)等。其中每個(gè)項(xiàng)目都是適合學(xué)生或業(yè)余愛好者的、在真實(shí)世界可用的硬件,且每個(gè)項(xiàng)目都會(huì)提供相關(guān)的背景知識(shí)來(lái)研究具體的項(xiàng)目領(lǐng)域。

工具推薦

整理編輯:zhangferry

KeeWeb

地址:https://keeweb.info/

軟件狀態(tài):免費(fèi),開源

軟件介紹

KeeWeb 是一個(gè)瀏覽器和桌面密碼管理器,兼容 KeePass 數(shù)據(jù)庫(kù)。它不需要任何服務(wù)器或額外的資源。該應(yīng)用程序可以在瀏覽器中運(yùn)行,也可以作為桌面應(yīng)用程序運(yùn)行。更重要的是它還可以利用 Dropbox、Google ?Drive 進(jìn)行遠(yuǎn)程同步。

關(guān)于我們

iOS 摸魚周報(bào),主要分享開發(fā)過(guò)程中遇到的經(jīng)驗(yàn)教訓(xùn)、優(yōu)質(zhì)的博客、高質(zhì)量的學(xué)習(xí)資料、實(shí)用的開發(fā)工具等。周報(bào)倉(cāng)庫(kù)在這里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的內(nèi)容推薦可以通過(guò) issue 的方式進(jìn)行提交。另外也可以申請(qǐng)成為我們的常駐編輯,一起維護(hù)這份周報(bào)。另可關(guān)注公眾號(hào):iOS成長(zhǎng)之路,后臺(tái)點(diǎn)擊進(jìn)群交流,聯(lián)系我們,獲取更多內(nèi)容。

往期推薦

iOS摸魚周報(bào) 第二十三期

iOS摸魚周報(bào) 第二十二期

iOS摸魚周報(bào) 第二十一期

iOS摸魚周報(bào) 第二十期

iOS成長(zhǎng)之路

主要專注于 iOS 領(lǐng)域,也會(huì)分享一些關(guān)于成長(zhǎng)和讀書的感悟。目前在跟一群可愛的小伙伴一起維護(hù) iOS 摸魚周報(bào),周報(bào)為聚合內(nèi)容,既有對(duì)于日常開發(fā)的總結(jié),也會(huì)整理收集一些非常棒的學(xué)習(xí)資料和文章。

54篇原創(chuàng)內(nèi)容

公眾號(hào)

參考資料

[1]

libextobj: https://github.com/jspahrsummers/libextobjc/blob/master/extobjc/EXTScope.h

[2]

關(guān)于iOS離屏渲染的深入研究: https://zhuanlan.zhihu.com/p/72653360

[3]

swift 閉包(閉包表達(dá)式、尾隨閉包、逃逸閉包、自動(dòng)閉包): https://juejin.cn/post/6972560642427486238

[4]

Apple Document - Closures: https://docs.swift.org/swift-book/LanguageGuide/Closures.html

總結(jié)

以上是生活随笔為你收集整理的iOS摸鱼周报 第二十四期的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。