存管理的核心考點(diǎn))
做了這么多年iOS開(kāi)發(fā)和校招輔導(dǎo)我一直覺(jué)得筆試是候選人最容易被誤判的一環(huán)。代碼能力在線但基礎(chǔ)概念含糊或者刷題刷得太泛沒(méi)抓到重點(diǎn)都會(huì)在筆試卷上直接暴露出來(lái)。B站2020校園招聘的這套iOS方向筆試卷二屬于典型的大廠移動(dòng)端校招筆試風(fēng)格覆蓋了Objective-C與Swift底層機(jī)制、內(nèi)存管理、多線程、網(wǎng)絡(luò)、UI事件傳遞、架構(gòu)設(shè)計(jì)等核心模塊。這篇文章就專門(mén)拆一拆這套卷子背后的考察意圖、高頻考點(diǎn)和解題思路給正在準(zhǔn)備iOS校招筆試的人一份可以直接照著復(fù)習(xí)的清單。這套卷子適合誰(shuí)看主要是兩類人一類是準(zhǔn)備投遞B站或其他中大型互聯(lián)網(wǎng)公司iOS崗位的應(yīng)屆生另一類是工作一兩年后想系統(tǒng)梳理iOS基礎(chǔ)、準(zhǔn)備跳槽的初級(jí)開(kāi)發(fā)。不管你是哪種只要把下面這些考點(diǎn)吃透筆試環(huán)節(jié)基本不會(huì)翻車。1. 從一張筆試卷看B站的校招篩選邏輯1.1 這套卷子到底想篩什么樣的人先聊一個(gè)很多人忽略的問(wèn)題B站這類公司的校招筆試卷并不是為了考倒你而是為了在幾千份簡(jiǎn)歷里快速定位“基礎(chǔ)扎實(shí)、有工程思維、能直接上手干活”的人。所以你看這套iOS卷子題目雖然覆蓋范圍廣但每一道題背后都對(duì)應(yīng)著一個(gè)實(shí)際開(kāi)發(fā)中會(huì)遇到的場(chǎng)景。比如內(nèi)存管理這塊考察循環(huán)引用和Auto Release Pool對(duì)應(yīng)的是日常開(kāi)發(fā)中寫(xiě)閉包、使用NSTimer、處理圖片加載時(shí)最容易埋的坑。再比如多線程部分考察死鎖對(duì)應(yīng)的是主線程同步操作、并發(fā)隊(duì)列嵌套這類線上事故高發(fā)場(chǎng)景。也就是說(shuō)筆試卷本質(zhì)上是在模擬“一個(gè)新人入職后會(huì)不會(huì)寫(xiě)出讓線上崩潰的代碼”這件事。明白了這個(gè)邏輯復(fù)習(xí)方向就清晰了不是去背零散的知識(shí)點(diǎn)而是要理解每個(gè)考點(diǎn)在真實(shí)業(yè)務(wù)里的觸發(fā)條件。這樣即使題目換個(gè)馬甲你也能一眼看穿它考的是哪塊知識(shí)。1.2 題型分布與答題節(jié)奏建議根據(jù)B站這套筆試卷二的常見(jiàn)結(jié)構(gòu)題目大致分三類單選多選、簡(jiǎn)答題、編程題。選擇題考察的是知識(shí)面廣度和概念準(zhǔn)確性簡(jiǎn)答題考察表達(dá)能力和原理理解深度編程題則直接檢驗(yàn)手寫(xiě)代碼的基本功。我建議的答題節(jié)奏是選擇題控制在25分鐘內(nèi)遇到拿不準(zhǔn)的不要死磕先標(biāo)記跳過(guò)。簡(jiǎn)答題每道控制在10分鐘左右核心是“結(jié)論先行、再說(shuō)原因、最后補(bǔ)個(gè)例子”。編程題留足40分鐘先理清思路再動(dòng)筆哪怕不能完整跑通也要把關(guān)鍵邏輯和邊界條件寫(xiě)清楚。這里有一個(gè)很重要的心得校招筆試的閱卷人通常是iOS組的技術(shù)骨干他們看卷子時(shí)最在意的是“這個(gè)人有沒(méi)有自己的思考”而不是“答案和標(biāo)準(zhǔn)答案一字不差”。所以簡(jiǎn)答題千萬(wàn)不要只寫(xiě)一句話哪怕你對(duì)這個(gè)知識(shí)點(diǎn)只有七八成把握也要把相關(guān)的上下文、觸發(fā)場(chǎng)景、解決思路都鋪開(kāi)寫(xiě)讓閱卷人看到你的分析過(guò)程。2. 核心考點(diǎn)拆解語(yǔ)言機(jī)制與內(nèi)存管理2.1 Objective-C與Swift的底層差異這套卷子的語(yǔ)言基礎(chǔ)部分十有八九會(huì)圍繞Objective-C和Swift的差異展開(kāi)。常見(jiàn)考法有兩種一種是直接問(wèn)“你如何理解Swift中的值類型與引用類型”另一種是給出一個(gè)混合工程場(chǎng)景讓你分析OC和Swift橋接時(shí)的注意事項(xiàng)。先說(shuō)值類型與引用類型。Swift里Struct是值類型Class是引用類型這個(gè)幾乎所有候選人都知道。但筆試想考察的是更深一層值類型在賦值、傳參時(shí)會(huì)觸發(fā)拷貝而Swift為了保證性能引入了Copy-on-Write機(jī)制也就是只有真正修改數(shù)據(jù)時(shí)才發(fā)生拷貝。很多答案只寫(xiě)到了“Struct是值拷貝”沒(méi)有點(diǎn)出COW這就丟掉了一個(gè)加分項(xiàng)。再說(shuō)OC和Swift橋接。實(shí)際工程中OC代碼調(diào)用Swift類需要在頭文件里引入#import Target-Swift.h而Swift調(diào)用OC代碼則需要通過(guò)Bridging Header。筆試如果出這個(gè)知識(shí)點(diǎn)通常會(huì)埋一個(gè)坑Swift類如果要被OC使用必須繼承自NSObject否則橋接后OC無(wú)法正確識(shí)別這個(gè)類的方法調(diào)用。2.2 Runtime機(jī)制與消息轉(zhuǎn)發(fā)流程Runtime是iOS筆試的釘子戶考點(diǎn)B站這套卷子大概率也會(huì)涉及。最基本的是消息發(fā)送機(jī)制objc_msgSend根據(jù)對(duì)象的isa指針找到類對(duì)象再通過(guò)SEL在method_list里查找IMP。如果找不到會(huì)走消息轉(zhuǎn)發(fā)流程。消息轉(zhuǎn)發(fā)的完整鏈路是動(dòng)態(tài)方法解析resolveInstanceMethod→ 快速轉(zhuǎn)發(fā)forwardingTargetForSelector→ 完整轉(zhuǎn)發(fā)methodSignatureForSelector和forwardInvocation。筆試??嫉膱?chǎng)景是你有一個(gè)對(duì)象調(diào)用了未實(shí)現(xiàn)的方法程序?yàn)槭裁礇](méi)有崩然后讓你描述整個(gè)查找過(guò)程。準(zhǔn)備這個(gè)考點(diǎn)時(shí)我建議你多問(wèn)自己一個(gè)“為什么”——為什么需要快速轉(zhuǎn)發(fā)和完整轉(zhuǎn)發(fā)兩層設(shè)計(jì)快速轉(zhuǎn)發(fā)是直接把消息轉(zhuǎn)發(fā)給另一個(gè)能處理的對(duì)象性能開(kāi)銷小完整轉(zhuǎn)發(fā)需要生成NSInvocation開(kāi)銷大但更靈活。理解了這層設(shè)計(jì)意圖題目怎么變你都能應(yīng)對(duì)而且這種“為什么這么設(shè)計(jì)”的思路恰恰是閱卷人最想在卷子上看到的。另外KVC和KVO也是Runtime的常見(jiàn)延伸考點(diǎn)。KVO的底層原理是動(dòng)態(tài)生成子類并重寫(xiě)setter方法這個(gè)子類會(huì)重寫(xiě)class方法讓外部感知不到類型變化。筆試很可能接著追問(wèn)手動(dòng)觸發(fā)KVO怎么實(shí)現(xiàn)答案是調(diào)用willChangeValueForKey和didChangeValueForKey這兩個(gè)方法。2.3 內(nèi)存管理從ARC到循環(huán)引用內(nèi)存管理部分每年都是重頭戲B站的卷子自然也不例外。ARC雖然是編譯器自動(dòng)插入retain/release但面試官真正想考的是你知不知道哪些場(chǎng)景會(huì)造成循環(huán)引用以及怎么定位和解決。最常見(jiàn)的循環(huán)引用場(chǎng)景有三個(gè)Block捕獲self、NSTimer持有target、Delegate使用strong修飾。筆試給出的代碼片段往往就是這三種之一讓你分析是否有循環(huán)引用并寫(xiě)出解決方案。Block捕獲self的解法是用__weak修飾self但在Block內(nèi)部如果需要長(zhǎng)期持有self比如異步任務(wù)完成后的回調(diào)單純使用weak可能導(dǎo)致對(duì)象提前釋放。這種場(chǎng)景的正確姿勢(shì)是在Block外部用weakSelfBlock內(nèi)部再聲明一個(gè)strongSelf來(lái)保證執(zhí)行期間self不會(huì)被釋放同時(shí)避免執(zhí)行過(guò)程中self被置nil導(dǎo)致的邏輯異常。NSTimer的坑在于Timer會(huì)強(qiáng)持有target如果target又強(qiáng)持有Timer通常作為屬性就形成了循環(huán)引用。iOS 10之后推薦使用block版本的timer方法在deinit里主動(dòng)調(diào)用invalidate。如果你回答的是“使用weakSelf”閱卷人一眼就能看出你只是背了答案因?yàn)閣eakSelf并不能打破Timer對(duì)target的持有關(guān)系。還有一個(gè)筆試高頻陷阱是autoreleasepool。很多候選人只知道autoreleasepool是自動(dòng)釋放池但不知道為什么for循環(huán)大量創(chuàng)建臨時(shí)對(duì)象時(shí)要用它包裹。答案是大量臨時(shí)對(duì)象比如循環(huán)讀取圖片數(shù)據(jù)如果都往當(dāng)前runloop綁定的autoreleasepool里注冊(cè)會(huì)持續(xù)占用內(nèi)存直到RunLoop進(jìn)入休眠才釋放。手動(dòng)添加一個(gè)局部的autoreleasepool可以及時(shí)釋放降低峰值內(nèi)存。3. 并發(fā)編程與網(wǎng)絡(luò)層基礎(chǔ)3.1 GCD核心概念與死鎖陷阱GCD是iOS并發(fā)編程的基礎(chǔ)這套卷子在這塊的考察通常集中在幾個(gè)方向隊(duì)列與任務(wù)的組合方式、死鎖的產(chǎn)生條件、線程安全的實(shí)現(xiàn)手段。先明確基本概念串行隊(duì)列和并發(fā)隊(duì)列決定任務(wù)的執(zhí)行方式同步和異步?jīng)Q定任務(wù)的分發(fā)方式。筆試??嫉慕M合包括并發(fā)隊(duì)列同步任務(wù)不會(huì)開(kāi)新線程串行隊(duì)列異步任務(wù)也只有一個(gè)線程。很多人在這里記混我建議你死記一個(gè)結(jié)論只有“并發(fā)隊(duì)列異步任務(wù)”才會(huì)真正并發(fā)開(kāi)辟多個(gè)線程。死鎖是選擇題和簡(jiǎn)答題都愛(ài)考的點(diǎn)。最經(jīng)典的陷阱就是在主隊(duì)列上執(zhí)行sync操作這時(shí)主隊(duì)列被當(dāng)前任務(wù)占用sync又去等這個(gè)任務(wù)完成就形成了互相等待。我在輔導(dǎo)時(shí)經(jīng)常讓候選人記住一句話不要在已經(jīng)處于某個(gè)串行隊(duì)列的環(huán)境里再對(duì)這個(gè)隊(duì)列執(zhí)行sync操作。還有一道B站當(dāng)年考過(guò)的變體題在一個(gè)自定義串行隊(duì)列里異步執(zhí)行任務(wù)AA內(nèi)部又對(duì)同一個(gè)串行隊(duì)列執(zhí)行sync操作。結(jié)果同樣會(huì)死鎖原因和主隊(duì)列死鎖一樣——串行隊(duì)列同一時(shí)刻只能執(zhí)行一個(gè)任務(wù)sync在等前面的任務(wù)結(jié)束而前面的任務(wù)又被sync阻塞了。3.2 鎖的選型與線程安全方案線程安全這塊考點(diǎn)從重量級(jí)到輕量級(jí)依次排開(kāi)NSLock、synchronized、信號(hào)量、atomic、以及無(wú)鎖方案。筆試題經(jīng)常給一個(gè)多線程讀寫(xiě)同一個(gè)字典的場(chǎng)景讓你選擇最合適的方案。synchronized本質(zhì)是對(duì)傳入對(duì)象加了一個(gè)遞歸鎖性能較差但使用簡(jiǎn)單適合低頻的臨界區(qū)保護(hù)。NSLock是標(biāo)準(zhǔn)的互斥鎖但要注意lock和unlock必須成對(duì)調(diào)用否則會(huì)死鎖。dispatch_semaphore是處理“資源并發(fā)數(shù)限制”的利器設(shè)置初始value為1就等價(jià)于一個(gè)互斥鎖設(shè)置為更大的值則可以實(shí)現(xiàn)流量控制。OC屬性的atomic修飾也經(jīng)常被拿來(lái)考察。很多人以為atomic就是絕對(duì)線程安全這是最大的誤解。atomic只保證屬性的getter和setter是原子操作但如果你先讀取字典、再修改其中某個(gè)key對(duì)應(yīng)的值這整個(gè)復(fù)合操作并沒(méi)有被原子化多條線程仍可能產(chǎn)生數(shù)據(jù)競(jìng)爭(zhēng)。筆試如果想拿高分要在答案里主動(dòng)點(diǎn)出這個(gè)“atomic不等于線程安全”的結(jié)論并且補(bǔ)充說(shuō)明真正安全的方式是使用并發(fā)隊(duì)列加讀寫(xiě)柵欄或者用NSLock把整個(gè)讀寫(xiě)邏輯包裹起來(lái)。3.3 網(wǎng)絡(luò)層考點(diǎn)HTTP、HTTPS與TCP網(wǎng)絡(luò)基礎(chǔ)也是校招筆試的???。三次握手和四次揮手基本是必考但光背狀態(tài)碼和標(biāo)志位是不夠的你需要能結(jié)合開(kāi)發(fā)場(chǎng)景解釋為什么是三次而不是兩次。三次握手的核心作用在于確認(rèn)雙方的接收和發(fā)送能力都正常兩次握手無(wú)法防止歷史重復(fù)連接請(qǐng)求導(dǎo)致的資源浪費(fèi)。HTTPS方面重點(diǎn)是TLS握手過(guò)程中證書(shū)驗(yàn)證和密鑰協(xié)商的流程。筆試簡(jiǎn)答題如果問(wèn)HTTPS為什么安全一定要從“機(jī)密性、完整性、身份驗(yàn)證”三個(gè)維度作答對(duì)稱加密保證數(shù)據(jù)機(jī)密性、摘要算法保證完整性、數(shù)字證書(shū)保證服務(wù)端身份可信。只要從這三個(gè)角度展開(kāi)得分率會(huì)高很多。B站作為視頻平臺(tái)面試中還可能順帶問(wèn)CDN和弱網(wǎng)優(yōu)化的基本思路。這里你得懂一點(diǎn)HTTPDNS可以繞過(guò)本地DNS的解析耗時(shí)和污染問(wèn)題長(zhǎng)連接和連接復(fù)用能減少頻繁建連的開(kāi)銷弱網(wǎng)環(huán)境下可以通過(guò)降低圖片清晰度、批量請(qǐng)求合并等手段優(yōu)化體驗(yàn)。這些點(diǎn)不一定在筆試中出現(xiàn)但在同場(chǎng)面試?yán)锉蛔穯?wèn)的概率非常高建議一并準(zhǔn)備。4. 架構(gòu)設(shè)計(jì)、UI機(jī)制與性能優(yōu)化4.1 從MVC到MVVM的架構(gòu)演進(jìn)B站的iOS客戶端體量不小筆試對(duì)架構(gòu)設(shè)計(jì)的考察往往不是讓你默寫(xiě)定義而是給一個(gè)場(chǎng)景讓你分析現(xiàn)有架構(gòu)的問(wèn)題并提出改進(jìn)方案。最典型的就是MVC在大型項(xiàng)目中的困境。MVC本身是清晰的但App規(guī)模變大后Controller會(huì)越來(lái)越臃腫大量業(yè)務(wù)邏輯、網(wǎng)絡(luò)回調(diào)、視圖更新都堆在Controller里導(dǎo)致它既難測(cè)試也難維護(hù)。MVVM的核心變化是引入ViewModel來(lái)承接原本屬于Controller的展示邏輯和業(yè)務(wù)邏輯Controller只負(fù)責(zé)視圖綁定和生命周期管理。筆試如果讓你寫(xiě)MVVM記得要提到數(shù)據(jù)綁定這一環(huán)。MVVM在iOS中有兩種實(shí)現(xiàn)路線一是基于KVO或Block手寫(xiě)綁定二是引入ReactiveCocoa或RxSwift這樣的響應(yīng)式框架。手寫(xiě)綁定的代碼量較大但能讓閱卷人看到你對(duì)處理邏輯的理解深度如果你選擇用RxSwift務(wù)必把關(guān)鍵操作符和線程切換寫(xiě)清楚。還有一個(gè)加分的角度是組件化。你可以把思路延伸到模塊劃分和依賴管理頂層是App殼工程中間是各個(gè)業(yè)務(wù)組件底層是基礎(chǔ)組件庫(kù)。組件間通信可以通過(guò)路由表或中間層完成避免模塊間直接引用。這個(gè)角度能讓你的答案脫穎而出因?yàn)榇蟛糠趾蜻x人只會(huì)聊MVC和MVVM的區(qū)別。4.2 事件傳遞機(jī)制與響應(yīng)鏈UI事件傳遞是iOS筆試中區(qū)分度最高的一塊。常見(jiàn)的考法是給出一個(gè)復(fù)雜的視圖層級(jí)讓你判斷點(diǎn)擊某個(gè)位置時(shí)事件最終由誰(shuí)響應(yīng)。完整的傳遞機(jī)制分兩個(gè)階段第一階段是Hit-Test系統(tǒng)從UIWindow開(kāi)始倒序遍歷子視圖調(diào)用pointInside:withEvent:和hitTest:withEvent:找到最合適的視圖。第二階段是響應(yīng)鏈?zhǔn)录牡谝豁憫?yīng)者開(kāi)始沿著nextResponder鏈條向上傳遞直到有對(duì)象處理這個(gè)事件。這個(gè)知識(shí)點(diǎn)的難點(diǎn)在于理解Hit-Test的逆向遍歷順序后添加的子視圖會(huì)先被遍歷因?yàn)樗趯蛹?jí)里處于最上面。筆試還經(jīng)常加一個(gè)變體——某個(gè)視圖的userInteractionEnabled設(shè)置為NO或者alpha小于0.01或者h(yuǎn)idden為YES這三種情況下該視圖不會(huì)出現(xiàn)在Hit-Test的命中結(jié)果里事件會(huì)直接傳給它的兄弟視圖。準(zhǔn)備這個(gè)考點(diǎn)時(shí)我建議你親手寫(xiě)一個(gè)例子驗(yàn)證自定義一個(gè)UIView重寫(xiě)hitTest:withEvent:打印調(diào)用順序和坐標(biāo)判斷能幫助你真正記住流程而不是背幾個(gè)結(jié)論。4.3 RunLoop與UI卡頓排查性能優(yōu)化方面RunLoop和卡頓排查是高頻命題角度。RunLoop的基本邏輯是App啟動(dòng)后主線程始終處于一個(gè)循環(huán)中不斷接收事件源并處理然后進(jìn)入休眠等待新事件。這里要重點(diǎn)理解RunLoop的兩種SourceSource0處理如觸摸事件這樣手動(dòng)觸發(fā)的源Source1處理基于端口的系統(tǒng)消息。定時(shí)器Timer則被注冊(cè)在RunLoop的Timer模式下。關(guān)于UI卡頓核心結(jié)論是主線程的RunLoop在一個(gè)周期內(nèi)要處理繪制、布局、點(diǎn)擊事件等所有任務(wù)如果單個(gè)任務(wù)執(zhí)行時(shí)間過(guò)長(zhǎng)就會(huì)觸發(fā)掉幀。筆試題經(jīng)常給一段在主線程同步加載大圖和數(shù)據(jù)解析的代碼讓你分析為什么卡頓并寫(xiě)出優(yōu)化方案。優(yōu)化的思路是把耗時(shí)操作放到子線程比如用異步隊(duì)列處理圖片解碼和JSON解析然后回到主線程更新UI。這里有一個(gè)常見(jiàn)的坑就是子線程回到主線程如果使用sync操作在某些情況下可能造成死鎖最好統(tǒng)一使用async。還有一個(gè)加分的進(jìn)階點(diǎn)預(yù)排版和預(yù)渲染。在子線程提前計(jì)算好文本的size和布局信息避免主線程在滑動(dòng)時(shí)才做計(jì)算這是短視頻和直播類App保障流暢度的重要手段。B站這類視頻App對(duì)這種優(yōu)化非??粗啬闳绻茉诖鸢咐锾岬竭@個(gè)點(diǎn)很容易和閱卷人產(chǎn)生共鳴。5. 常見(jiàn)失分點(diǎn)與筆試實(shí)戰(zhàn)技巧5.1 高頻失分點(diǎn)速查表根據(jù)我這些年看到的校招筆試卷有些失分點(diǎn)幾乎是統(tǒng)一的。整理成表格方便你復(fù)習(xí)時(shí)對(duì)照自查失分點(diǎn)錯(cuò)誤表現(xiàn)正確思路選擇題陷阱看到“原子性”就直接選線程安全atomic只保證getter/setter原子不保證復(fù)合操作安全簡(jiǎn)答題太過(guò)簡(jiǎn)短只寫(xiě)“會(huì)循環(huán)引用”不寫(xiě)原因要寫(xiě)出誰(shuí)持有誰(shuí)、為什么形成環(huán)、用什么方式打破死鎖判斷不完整只判斷出主線程sync導(dǎo)致死鎖要補(bǔ)充自定義串行隊(duì)列的同類問(wèn)題事件響應(yīng)鏈答反以為事件從最上層視圖先處理先Hit-Test確定第一響應(yīng)者再沿響應(yīng)鏈向上傳遞不會(huì)手寫(xiě)綁定只會(huì)口述MVVM概念至少能寫(xiě)出簡(jiǎn)單的Block回調(diào)或KVO綁定示例代碼這份表格里的內(nèi)容本質(zhì)上是“概念記憶”和“機(jī)制理解”之間的差距。選擇題可以靠背簡(jiǎn)答題和編程題只能靠實(shí)打?qū)嵉睦斫狻?.2 編程題的解題套路這套卷子的編程題通常不會(huì)太偏常見(jiàn)類型包括鏈表反轉(zhuǎn)、二叉樹(shù)遍歷、字符串處理、簡(jiǎn)單的動(dòng)態(tài)規(guī)劃以及少量iOS相關(guān)的代碼題如手寫(xiě)一個(gè)線程安全的單例、手寫(xiě)KVO的替代方案。手寫(xiě)單例幾乎年年考。以O(shè)C為例正經(jīng)的寫(xiě)法是保證兩個(gè)層面安全一是用dispatch_once保證線程安全二是重寫(xiě)allocWithZone、copyWithZone等方法防止外部通過(guò)非shared接口創(chuàng)建新實(shí)例。很多候選人只寫(xiě)了dispatch_once漏掉了后一層保護(hù)這會(huì)被扣分。另外一個(gè)值得關(guān)注的題型是“給一段有Bug的代碼找出問(wèn)題并修復(fù)”。這種題考的其實(shí)是代碼Review能力。答題時(shí)要按嚴(yán)重程度排序輸出先說(shuō)會(huì)導(dǎo)致崩潰的問(wèn)題比如數(shù)組越界、空指針再說(shuō)邏輯錯(cuò)誤最后說(shuō)性能和規(guī)范問(wèn)題。這種分層的表達(dá)方式能讓閱卷人一眼看出你具備工程思維。5.3 筆試前的復(fù)習(xí)節(jié)奏與心態(tài)調(diào)整最后聊一下備考策略。如果你還有兩到三周的時(shí)間我建議按“廣度優(yōu)先、深度跟進(jìn)”的節(jié)奏走第一周把所有基礎(chǔ)考點(diǎn)過(guò)一遍做到每個(gè)概念都能用自己的話復(fù)述第二周集中刷題重點(diǎn)是在紙上手寫(xiě)代碼不要只在IDE里敲第三周做模擬卷嚴(yán)格計(jì)時(shí)訓(xùn)練答題節(jié)奏。筆試前一天不要再學(xué)新知識(shí)把這份速查表和自己的錯(cuò)題筆記翻一遍就行。真正上了考場(chǎng)遇到不會(huì)的題不要慌先用排除法縮小范圍再調(diào)動(dòng)相關(guān)的上下文寫(xiě)點(diǎn)與分析過(guò)程相關(guān)的內(nèi)容。校招筆試不是要求你滿分而是要求你在有限時(shí)間里把自己會(huì)的都穩(wěn)定輸出。這一點(diǎn)比多背十個(gè)知識(shí)點(diǎn)更值錢(qián)。我自己的體會(huì)是準(zhǔn)備B站這類大廠筆試卷最大的收獲不是最后拿到Offer而是通過(guò)復(fù)習(xí)把iOS的知識(shí)體系真正串起來(lái)了。很多開(kāi)發(fā)者在日常工作中只用到了UI搭建和接口聯(lián)調(diào)對(duì)底層機(jī)制是模糊的但筆試卷會(huì)逼你把這塊短板補(bǔ)上。這種系統(tǒng)性沉淀對(duì)后續(xù)的面試和實(shí)際開(kāi)發(fā)都有長(zhǎng)期幫助。還是那句話基礎(chǔ)不牢地動(dòng)山搖——?jiǎng)e只盯著題目本身把每個(gè)考點(diǎn)背后的原理吃透你拿到的就不只是一份及格卷。