做了快5年iOS,這份面試題讓我從15K變成了30K

大廠面試題

點贊再看,養(yǎng)成習慣钝腺,
作為一個開發(fā)者抛姑,有一個學習的氛圍跟一個交流圈子特別重要,這是一個我的iOS交流群:761407670 艳狐,不管你是小白還是大牛歡迎入駐 定硝,分享BAT,阿里面試題、面試經(jīng)驗毫目,討論技術蔬啡, 大家一起交流學習成長!

在博主認為镀虐,對于iOS面試以及進階的最佳學習方法莫過于刷題+博客+書籍+總結箱蟆,前三者博主將淋漓盡致地揮毫于這篇博客文章中,至于總結在于個人刮便,實際上越到后面你會發(fā)現(xiàn)面試并不難空猜,其次就是在刷題的過程中有沒有去思考,刷題只是次之恨旱,這又是一個層次了辈毯,這里暫時不提后面再談。

博主總結了一系列大廠面試中常問的面試技術點搜贤,深入解析以及答案漓摩,將為最近準備面試的各開發(fā)者去大廠保駕護航,

何謂面試入客? 博主所理解的面試管毙,它是一個過程,是不斷沉淀桌硫、不斷總結夭咬、善于傳達自己的專業(yè)領域技術以及解決問題能力的過程。以下是博主總結的一些面試題铆隘,文中如有錯誤卓舵,懇請各位大佬指出!

1膀钠、NSArray與NSSet的區(qū)別掏湾?

  • NSArray內(nèi)存中存儲地址連續(xù),而NSSet不連續(xù)
  • NSSet效率高肿嘲,內(nèi)部使用hash查找融击;NSArray查找需要遍歷
  • NSSet通過anyObject訪問元素,NSArray通過下標訪問

2雳窟、NSHashTable與NSMapTable尊浪?

  • NSHashTable是NSSet的通用版本,對元素弱引用,可變類型拇涤;可以在訪問成員時copy
  • NSMapTable是NSDictionary的通用版本捣作,對元素弱引用,可變類型鹅士;可以在訪問成員時copy

(注:NSHashTable與NSSet的區(qū)別:NSHashTable可以通過option設置元素弱引用/copyin券躁,只有可變類型。但是添加對象的時候NSHashTable耗費時間是NSSet的兩倍掉盅。
NSMapTable與NSDictionary的區(qū)別:同上)

3嘱朽、屬性關鍵字assign、retain怔接、weak搪泳、copy

  • assign:用于基本數(shù)據(jù)類型和結構體。如果修飾對象的話扼脐,當銷毀時岸军,屬性值不會自動置nil,可能造成野指針瓦侮。
  • weak:對象引用計數(shù)為0時艰赞,屬性值也會自動置nil
  • retain:強引用類型,ARC下相當于strong肚吏,但block不能用retain修飾方妖,因為等同于assign不安全。
  • strong:強引用類型罚攀,修飾block時相當于copy党觅。

4、weak屬性如何自動置nil的斋泄?

  • Runtime會對weak屬性進行內(nèi)存布局杯瞻,構建hash表:以weak屬性對象內(nèi)存地址為key,weak屬性值(weak自身地址)為value炫掐。當對象引用計數(shù)為0 dealloc時魁莉,會將weak屬性值自動置nil。

5募胃、Block的循環(huán)引用旗唁、內(nèi)部修改外部變量、三種block

  • block強引用self痹束,self強引用block
  • 內(nèi)部修改外部變量:block不允許修改外部變量的值检疫,這里的外部變量指的是棧中指針的內(nèi)存地址。__block的作用是只要觀察到變量被block使用参袱,就將外部變量在棧中的內(nèi)存地址放到堆中电谣。
  • 三種block:NSGlobalBlack(全局)秽梅、NSStackBlock(棧block)抹蚀、NSMallocBlock(堆block)

6剿牺、KVO底層實現(xiàn)原理?手動觸發(fā)KVO环壤?swift如何實現(xiàn)KVO晒来?

  • KVO原理:當觀察一個對象時,runtime會動態(tài)創(chuàng)建繼承自該對象的類郑现,并重寫被觀察對象的setter方法湃崩,重寫的setter方法會負責在調(diào)用原setter方法前后通知所有觀察對象值得更改,最后會把該對象的isa指針指向這個創(chuàng)建的子類接箫,對象就變成子類的實例攒读。
  • 如何手動觸發(fā)KVO:在setter方法里,手動實現(xiàn)NSObject兩個方法:willChangeValueForKey辛友、didChangeValueForKey
  • swift的kvo:繼承自NSObject的類薄扁,或者直接willset/didset實現(xiàn)。

7废累、categroy為什么不能添加屬性邓梅?怎么實現(xiàn)添加?與Extension的區(qū)別邑滨?category覆蓋原類方法日缨?多個category調(diào)用順序

  • Runtime初始化時categroy的內(nèi)存布局已經(jīng)確定,沒有ivar掖看,所以默認不能添加屬性匣距。
  • 使用runtime的關聯(lián)對象,并重寫setter和getter方法哎壳。
  • Extenstion編譯期創(chuàng)建墨礁,可以添加成員變量ivar,一般用作隱藏類的信息耳峦。必須要有類的源碼才可以添加恩静,如NSString就不能創(chuàng)建Extension。
  • category方法會在runtime初始化的時候copy到原來前面蹲坷,調(diào)用分類方法的時候直接返回驶乾,不再調(diào)用原類。如何保持原類也調(diào)用
  • 多個category的調(diào)用順序按照:Build Phases ->Complie Source 中的編譯順序循签。
8级乐、 block的本質(zhì)是什么?有幾種block县匠?分別是怎樣產(chǎn)生的风科?

參考鏈接

block與函數(shù)類似撒轮,只不過是直接定義在另一個函數(shù)里,和定義它的那個函數(shù)共享同一個范圍內(nèi)的東西贼穆,
block的強大之處是:在聲明它的范圍里题山,所有變量都可以為其捕獲,這也就是說故痊,那個范圍內(nèi)的全部變量顶瞳,在block依然可以用,默認情況下愕秫,為block捕獲的變量慨菱,是不可以在block里修改的,不過聲明的時候可以加上__block修飾符戴甩,這樣就可以再block內(nèi)修改了符喝。

面試題持續(xù)更新記得關注我哦!

9甜孤、對 runtime 的理解协饲。——主要是方法調(diào)用時如何查找緩存课蔬,如何找到方法囱稽,找不到方法時怎么轉(zhuǎn)發(fā),對象的內(nèi)存布局

OC中向?qū)ο蟀l(fā)送消息時二跋,runtime會根據(jù)對象的isa指針找到對象所屬的類战惊,然后在該類的方法列表和父類的方法列表中尋找方法執(zhí)行。如果在最頂層父類中沒找到方法執(zhí)行扎即,就會進行消息轉(zhuǎn)發(fā):Method resoution(實現(xiàn)方法)吞获、fast forwarding(轉(zhuǎn)發(fā)給其他對象)、normal forwarding(完整消息轉(zhuǎn)發(fā)谚鄙「骺剑可以轉(zhuǎn)發(fā)給多個對象)

10、runtime 中闷营,SEL和IMP的區(qū)別?

每個類對象都有一個方法列表烤黍,方法列表存儲方法名、方法實現(xiàn)傻盟、參數(shù)類型速蕊,SEL是方法名(編號),IMP指向方法實現(xiàn)的首地址

11娘赴、autoreleasepool的原理和使用場景?

  • 若干個autoreleasepoolpage組成的雙向鏈表的棧結構规哲,objc_autoreleasepoolpush、objc_autoreleasepoolpop诽表、objc_autorelease
  • 使用場景:多次創(chuàng)建臨時變量導致內(nèi)存上漲時唉锌,需要延遲釋放
  • autoreleasepoolpage的內(nèi)存結構:4k存儲大小
image

12隅肥、Autorelase對象什么時候釋放

在沒有手加Autorelease Pool的情況下袄简,Autorelease對象是在當前的runloop迭代結束時釋放的腥放,而它能夠釋放的原因是系統(tǒng)在每個runloop迭代中都加入了自動釋放池Push和Pop。

13痘番、Runloop與線程的關系捉片?Runloop的mode? Runloop的作用平痰?內(nèi)部機制汞舱?

  • 每一個線程都有一個runloop,主線程的runloop默認啟動宗雇。
  • mode:主要用來指定事件在運行時循環(huán)的優(yōu)先級
  • 作用:保持程序的持續(xù)運行昂芜、隨時處理各種事件、節(jié)省cpu資源(沒事件休息釋放資源)赔蒲、渲染屏幕UI

14泌神、iOS中使用的鎖、死鎖的發(fā)生與避免

  • @synchronized舞虱、信號量欢际、NSLock等
  • 死鎖:多個線程同時訪問同一資源,造成循環(huán)等待矾兜。GCD使用異步線程损趋、并行隊列

15、NSOperation和GCD的區(qū)別

  • GCD底層使用C語言編寫高效椅寺、NSOperation是對GCD的面向?qū)ο蟮姆庋b浑槽。對于特殊需求,如取消任務返帕、設置任務優(yōu)先級桐玻、任務狀態(tài)監(jiān)聽,NSOperation使用起來更加方便荆萤。
  • NSOperation可以設置依賴關系镊靴,而GCD只能通過dispatch_barrier_async實現(xiàn)
  • NSOperation可以通過KVO觀察當前operation執(zhí)行狀態(tài)(執(zhí)行/取消)
  • NSOperation可以設置自身優(yōu)先級(queuePriority)。GCD只能設置隊列優(yōu)先級(DISPATCH_QUEUE_PRIORITY_DEFAULT)链韭,無法在執(zhí)行的block中設置優(yōu)先級
  • NSOperation可以自定義operation如NSInvationOperation/NSBlockOperation偏竟,而GCD執(zhí)行任務可以自定義封裝但沒有那么高的代碼復用度
  • GCD高效,NSOperation開銷相對高

16梧油、oc與js交互

  • 攔截url
  • JavaScriptCore(只適用于UIWebView)
  • WKScriptMessageHandler(只適用于WKWebView)
  • WebViewJavaScriptBridge(第三方框架)

17苫耸、swift相比OC有什么優(yōu)勢?

18儡陨、struct褪子、Class的區(qū)別

  • class可以繼承量淌,struct不可以
  • class是引用類型,struct是值類型
  • struct在function里修改property時需要mutating關鍵字修飾

19嫌褪、訪問控制關鍵字(public呀枢、open、private笼痛、filePrivate裙秋、internal)

  • public與open:public在module內(nèi)部中,class和func都可以被訪問/重載/繼承缨伊,外部只能訪問摘刑;而open都可以
  • private與filePrivate:private修飾class/func,表示只能在當前class源文件/func內(nèi)部使用刻坊,外部不可以被繼承和訪問枷恕;而filePrivate表示只能在當前swift源文件內(nèi)訪問
  • internal:在整個模塊或者app內(nèi)都可以訪問,默認訪問級別谭胚,可寫可不寫

20徐块、OC與Swift混編

  • OC調(diào)用swift:import "工程名-swift.h” @objc
  • swift調(diào)用oc:橋接文件

21、map灾而、filter胡控、reduce?map與flapmap的區(qū)別旁趟?

  • map:數(shù)組中每個元素都經(jīng)過某個方法轉(zhuǎn)換昼激,最后返回新的數(shù)組(xx.map({[圖片上傳失敗...(image-531157-1592632529543)]

    0}))

  • flatmap:同map類似,區(qū)別在flatmap返回的數(shù)組不存在nil轻庆,并且會把optional解包癣猾;而且還可以把嵌套的數(shù)組打開變成一個([[1,2],[2,3,4],[5,6]] ->[1,2,2,3,4,5,6])

  • filter:用戶篩選元素(xxx.filter({$0 > 25}),篩選出大于25的元素組成新數(shù)組)

  • reduce:把數(shù)組元素組合計算為一個值余爆,并接收初始值()

image

22纷宇、guard與defer

  • guard用于提前處理錯誤數(shù)據(jù),else退出程序蛾方,提高代碼可讀性
  • defer延遲執(zhí)行像捶,回收資源。多個defer反序執(zhí)行桩砰,嵌套defer先執(zhí)行外層拓春,后執(zhí)行內(nèi)層

23、try亚隅、try?與try!

  • try:手動捕捉異常
  • try?:系統(tǒng)幫我們處理硼莽,出現(xiàn)異常返回nil;沒有異常返回對應的對象
  • try!:直接告訴系統(tǒng)煮纵,該方法沒有異常懂鸵。如果出現(xiàn)異常程序會crash

24偏螺、@autoclosure:把一個表達式自動封裝成閉包

25、throws與rethrows:throws另一個throws時匆光,將前者改為rethrows

26套像、App啟動優(yōu)化策略?main函數(shù)執(zhí)行前后怎么優(yōu)化

  • 啟動時間 = pre-main耗時+main耗時
  • pre-main階段優(yōu)化:
  • 刪除無用代碼
  • 抽象重復代碼
  • +load方法做的事情延遲到initialize中终息,或者+load的事情不宜花費太多時間
  • 減少不必要的framework夺巩,或者優(yōu)化已有framework
  • Main階段優(yōu)化
  • didFinishLauchingwithOptions里代碼延后執(zhí)行
  • 首次啟動渲染的頁面優(yōu)化

27、crash防護周崭?

  • unrecognized selector crash
  • KVO crash
  • NSNotification crash
  • NSTimer crash
  • Container crash(數(shù)組越界柳譬,插nil等)
  • NSString crash (字符串操作的crash)
  • Bad Access crash (野指針)
  • UI not on Main Thread Crash (非主線程刷UI (機制待改善))

28、內(nèi)存泄露問題休傍?

主要集中在循環(huán)引用問題中征绎,如block蹲姐、NSTime磨取、perform selector引用計數(shù)問題。

29柴墩、UI卡頓優(yōu)化忙厌?

30、架構&設計模式

  • MVC設計模式介紹
  • MVVM介紹江咳、MVC與MVVM的區(qū)別逢净?
  • ReactiveCocoa的熱信號與冷信號
  • 緩存架構設計LRU方案
  • SDWebImage源碼,如何實現(xiàn)解碼
  • AFNetWorking源碼分析
  • 組件化的實施歼指,中間件的設計
  • 哈希表的實現(xiàn)原理爹土?如何解決沖突

31、數(shù)據(jù)結構&算法

  • 快速排序踩身、歸并排序
  • 二維數(shù)組查找(每一行都按照從左到右遞增的順序排序胀茵,每一列都按照從上到下遞增的順序排序。請完成一個函數(shù)挟阻,輸入這樣的一個二維數(shù)組和一個整數(shù)琼娘,判斷數(shù)組中是否含有該整數(shù))
  • 二叉樹的遍歷:判斷二叉樹的層數(shù)
  • 單鏈表判斷環(huán)

32、計算機基礎

  1. http與https附鸽?socket編程脱拼?tcp、udp坷备?get與post熄浓?
  2. tcp三次握手與四次握手
  3. 進程與線程的區(qū)別

下面還有一些更干的面試題,你值得擁有省撑!
招聘一個靠譜的 iOS
github里面有大神附上了答案
招聘一個靠譜的 iOS 答案

這里還有MrPeak大神的中級面試題
iOS 中級面試題
下面是答案
iOS 中級面試題 答案

推薦

  1. 直擊2020——iOS 面試題大全(補充完整版)
  2. “新”攜程赌蔑,阿里谎柄,騰訊iOS面試常見問題合集(附答案)
  3. 我是如何同時拿到阿里和騰訊offer的
  4. 騰訊&阿里&美團&快手&字節(jié)等10公司面經(jīng)
  5. 騰訊社招iOS面試記錄
  6. 最新阿里騰訊頭條美團等iOS面試總結

歡迎大家關注我面試小專欄 : iOS中高級進階之路 有我準備的一線大廠面試資料和簡歷模板,歡迎Star惯雳!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朝巫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子石景,更是在濱河造成了極大的恐慌劈猿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潮孽,死亡現(xiàn)場離奇詭異揪荣,居然都是意外死亡,警方通過查閱死者的電腦和手機往史,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門仗颈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椎例,你說我怎么就攤上這事挨决。” “怎么了订歪?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵脖祈,是天一觀的道長。 經(jīng)常有香客問我刷晋,道長盖高,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任眼虱,我火速辦了婚禮喻奥,結果婚禮上,老公的妹妹穿的比我還像新娘捏悬。我一直安慰自己撞蚕,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布邮破。 她就那樣靜靜地躺著诈豌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抒和。 梳的紋絲不亂的頭發(fā)上矫渔,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音摧莽,去河邊找鬼庙洼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的油够。 我是一名探鬼主播蚁袭,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼石咬!你這毒婦竟也來了揩悄?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鬼悠,失蹤者是張志新(化名)和其女友劉穎删性,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焕窝,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡蹬挺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了它掂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巴帮。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖虐秋,靈堂內(nèi)的尸體忽然破棺而出榕茧,到底是詐尸還是另有隱情,我是刑警寧澤熟妓,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布雪猪,位于F島的核電站,受9級特大地震影響起愈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜译仗,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一抬虽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纵菌,春花似錦阐污、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至序苏,卻和暖如春手幢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忱详。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工围来, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓监透,卻偏偏與公主長得像桶错,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胀蛮,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355