1,請(qǐng)做一個(gè)簡(jiǎn)單的自我介紹
面試官,你好,我叫XXX,我是2015年計(jì)算機(jī)專業(yè) 本科畢業(yè),畢業(yè)之后一直從事iOS開(kāi)發(fā)工作,主要使用的語(yǔ)言是OC。
在過(guò)往的工作中,擔(dān)任過(guò)北京紅云融通技術(shù)有限公司iOS開(kāi)發(fā),我們公司的主要產(chǎn)品是紅云會(huì)議以及sdk,這是一款類似于騰訊會(huì)議的產(chǎn)品,我的主要工作是,主導(dǎo)紅云會(huì)議APP和SDK迭代開(kāi)發(fā)已經(jīng)上架發(fā)布任務(wù),期間優(yōu)化了千人入會(huì)的會(huì)議入會(huì)場(chǎng)景,從入會(huì)40+s 優(yōu)化到2s,修復(fù)了現(xiàn)有版本中的內(nèi)存泄漏,解決程序異常閃退問(wèn)題。
此前在成都御順投資參與重構(gòu)CRM系統(tǒng),這是 是款姐內(nèi)部員工使用的一款客戶管理 app,完成了多分公司不同功能的業(yè)務(wù)場(chǎng)景。
在之前。就職于成都博智維訊技術(shù)有限公司 期間獨(dú)立完成水井坊公司的展銷類APP英雄匯開(kāi)發(fā)任務(wù),從開(kāi)發(fā)到上架都是獨(dú)立完成的,再之前還參與過(guò)南京SFA洋和項(xiàng)目,以及1919配送端的項(xiàng)目開(kāi)發(fā),集成百度地圖導(dǎo)航模塊,完成了到目的地的路徑規(guī)劃功能。
另外在工作中我也參與過(guò)安卓,前端,flutter的部分頁(yè)面的開(kāi)發(fā)工作,對(duì)其他語(yǔ)言有一定的了解,期待能在貴公司發(fā)揮我的專業(yè)技能,創(chuàng)造價(jià)值。
2.你在項(xiàng)目中遇到過(guò)什么比較難的問(wèn)題,怎么解決的
當(dāng)時(shí)我們做視頻會(huì)議SDK時(shí),碰到一個(gè)挺頭疼的問(wèn)題:App開(kāi)千人大會(huì)的時(shí)候,入會(huì)特別慢(要十幾秒),還動(dòng)不動(dòng)就閃退。用低配iPhone的用戶經(jīng)常抱怨,一進(jìn)會(huì)議手機(jī)就發(fā)燙,甚至直接卡死。
后來(lái)經(jīng)過(guò)排查我發(fā)現(xiàn)主要問(wèn)題是:入會(huì)時(shí)一次性加載太多東西,而且進(jìn)退會(huì)之后內(nèi)存沒(méi)有釋放完全,造成內(nèi)存暴漲APP閃退。
最終的解決方案是,修復(fù)了頁(yè)面加載機(jī)制,原來(lái)是按照入會(huì)人數(shù)創(chuàng)建視圖,后面創(chuàng)建了一個(gè)試圖控制的類,用一個(gè)數(shù)組來(lái)存儲(chǔ)一個(gè)對(duì)象,實(shí)現(xiàn)按需加載,最多只創(chuàng)建6個(gè)試圖,將入會(huì)時(shí)間縮短到2s內(nèi),另外關(guān)于內(nèi)存泄露的問(wèn)題,根據(jù)xcode 工具,發(fā)現(xiàn)是很多循環(huán)引用的錯(cuò)誤,采用weak strong關(guān)鍵字解決內(nèi)存泄漏問(wèn)題,避免的APP的閃退
3,你覺(jué)得你的優(yōu)勢(shì)是什么
我認(rèn)為自己的優(yōu)勢(shì)有幾點(diǎn),
第一,因?yàn)殚_(kāi)發(fā)ios已經(jīng)多年,遇到過(guò)很多性能優(yōu)化和內(nèi)存泄漏方面的問(wèn)題,所以對(duì)于這類問(wèn)題的定位和解決有經(jīng)驗(yàn)。
第二,常規(guī)任務(wù)完成迅速,在界面搭建上,寫過(guò)很多純代碼以及xib的操作,能夠快速響應(yīng)開(kāi)發(fā)任務(wù)并且快速交付。
第三,獨(dú)立完成過(guò)多個(gè)項(xiàng)目,熟悉ios從開(kāi)發(fā)到上架的全部流程
第四,樂(lè)于接受新事務(wù),能夠利用ai工具,例如gpt deepseek尋找解決問(wèn)題的辦法
第五,對(duì)其他語(yǔ)言也有所接觸,能夠快速上手開(kāi)發(fā)
4,你有研究過(guò)第三方庫(kù)的源碼嗎? 有什么收獲
我讀過(guò)一些第三方庫(kù)的源碼,印象比較深刻的是SDWebImage這個(gè)庫(kù)
其中印象深刻的是緩存管理這塊,iOS的緩存一般包括 內(nèi)存緩存和硬盤緩存兩方面
SD為減少網(wǎng)絡(luò)流量,下載完圖片后存儲(chǔ)到本地,下次再獲取同一張圖片時(shí),直接從本地獲取,提升用戶體驗(yàn),能快速?gòu)谋镜孬@取呈現(xiàn)給用戶。
SDWebImage的圖片緩存實(shí)現(xiàn)主要基于內(nèi)存和磁盤兩級(jí)緩存,結(jié)合高效的資源管理策略。具體實(shí)現(xiàn)可以分為以下幾個(gè)關(guān)鍵點(diǎn):
內(nèi)存緩存(快速響應(yīng))
使用NSCache存儲(chǔ)最近訪問(wèn)的圖片,它會(huì)在內(nèi)存不足時(shí)自動(dòng)清理低頻數(shù)據(jù),避免應(yīng)用被系統(tǒng)終止。
通過(guò)URL生成唯一的哈希鍵(如MD5處理),以O(shè)(1)時(shí)間復(fù)雜度快速查找圖片,類似于字典的結(jié)構(gòu)。
磁盤緩存(持久化存儲(chǔ))
圖片以文件形式存儲(chǔ)在Library/Caches目錄,文件名通過(guò)URL哈希處理,避免命名沖突。
根據(jù)圖片格式(如JPEG/PNG)選擇最優(yōu)壓縮方式存儲(chǔ),減少磁盤占用。
多級(jí)緩存策略(高效查詢)
- 查詢流程:先查內(nèi)存緩存 → 未命中則異步查磁盤 → 仍無(wú)數(shù)據(jù)才觸發(fā)網(wǎng)絡(luò)下載。
- 淘汰機(jī)制:
- 內(nèi)存緩存基于NSCache的LRU(最近最少使用)策略自動(dòng)清理。
- 磁盤緩存默認(rèn)7天有效期,并限制最大緩存容量,定期清理舊文件。
防重復(fù)下載與線程安全
使用URLCallbacks字典記錄所有進(jìn)行中的下載任務(wù)。當(dāng)多個(gè)請(qǐng)求同一URL時(shí),通過(guò)回調(diào)數(shù)組復(fù)用下載任務(wù),避免重復(fù)網(wǎng)絡(luò)請(qǐng)求。
通過(guò)GCD的屏障隊(duì)列(barrierQueue)保證對(duì)URLCallbacks的線程安全讀寫,確保多線程環(huán)境下不會(huì)出現(xiàn)競(jìng)爭(zhēng)。
性能優(yōu)化細(xì)節(jié)
后臺(tái)解碼:下載完成后在子線程解碼圖片,避免主線程卡頓。
異步存儲(chǔ):磁盤緩存寫入通過(guò)串行隊(duì)列異步執(zhí)行,不阻塞主線程。
靈活的緩存控制
通過(guò)SDWebImageOptions參數(shù)支持多種場(chǎng)景:
SDWebImageRefreshCached:強(qiáng)制跳過(guò)緩存重新下載(適用于圖片可能更新的場(chǎng)景)。
SDWebImageCacheMemoryOnly:僅使用內(nèi)存緩存(臨時(shí)數(shù)據(jù)避免磁盤占用)。
SDWebImageQueryDataWhenInMemory:內(nèi)存命中時(shí)仍校驗(yàn)數(shù)據(jù)有效性(如ETag)。
5,你對(duì)性能優(yōu)化有什么想法
關(guān)于性能優(yōu)化,可以從5個(gè)方面入手,
- cpu過(guò)載
復(fù)雜的計(jì)算,大量的數(shù)據(jù)處理,同步任務(wù)的阻塞主線程造成過(guò)載,我們可以使用緩存和預(yù)處理等方式減少不必要的計(jì)算 - GPU 過(guò)載
高復(fù)雜的圖形操作,紋理資源過(guò)多,過(guò)度繪制等會(huì)造成GPU過(guò)載
我們需要避免過(guò)度繪制,確保UI層次結(jié)構(gòu)簡(jiǎn)單,減少?gòu)?fù)雜的圖形操作,優(yōu)化圖形資源的使用以及使用合適的圖形框架和技術(shù),比如metal和core aniamation ,提高渲染效率 - 內(nèi)存壓力
過(guò)多的內(nèi)存分配,內(nèi)存的釋放不及時(shí),以及資源的泄漏等會(huì)造成內(nèi)存壓力,我們可以通過(guò)減少內(nèi)存的分配,及時(shí)釋放資源,使用autoreleasepool 控制內(nèi)存使用,避免內(nèi)存泄漏,確保圖形資源的的有效管理,避免不必要紋理和緩存 - 主線程的阻塞
長(zhǎng)時(shí)間的同步任務(wù),網(wǎng)絡(luò)請(qǐng)求,文件的I/O 等造成過(guò)載主線程的阻塞,
我們要避免在主線程進(jìn)行同步操作,比如網(wǎng)絡(luò)請(qǐng)求,文件的IO等,將主線程任務(wù)移動(dòng)到后臺(tái)線程,使用GCD是處理異步任務(wù)等 - 過(guò)度繪制
復(fù)雜的視圖層級(jí),冗余的UI元素等,錯(cuò)誤的參數(shù)導(dǎo)致的沖突等會(huì)造成過(guò)度繪制,我們需要確保參數(shù)的合理,避免動(dòng)畫時(shí)間過(guò)長(zhǎng)或過(guò)短,避免動(dòng)畫沖突,確保動(dòng)畫的順序和邏輯,使用合適的動(dòng)畫工具,如core Animaiton uikit 動(dòng)畫等,確保動(dòng)畫流暢