前言:
一千個讀者眼中有一千個哈姆雷特,一千名 iOS 程序員心目中就有一千套 iOS 高級面試題。本文就是筆者認為可以用來面試高級 iOS 程序員的面試題。
這套題的題目跟公司和業(yè)務(wù)都沒有關(guān)系,而且也并不代表筆者本人可以把這些題回答得非常好,筆者只是將一部分覺得比較好的題從收集的面試題里面抽出來了而已。
收集的面試題有以下三個來源:
1.筆者在準備面試的過程中搜集并整理過的面試題。
2.筆者在準備面試的過程中自己思考過的新題。
3.筆者在面試過程中遇到的覺得比較好的題。
本文分為三個部分展開:
1.面試題
2.喜歡考察的和不喜歡考察的題
3.建議準備數(shù)據(jù)結(jié)構(gòu)和算法題
第一部分就是面試題了;第二部分給出了筆者喜歡考察和不喜歡考察的題以及原因;第三部分是筆者建議大家準備數(shù)據(jù)結(jié)構(gòu)和算法題的原因。
面試題
iOS 基礎(chǔ)題
1.分類和擴展有什么區(qū)別?可以分別用來做什么?分類有哪些局限性?分類的結(jié)構(gòu)體里面有哪些成員?
2.講一下atomic的實現(xiàn)機制;為什么不能保證絕對的線程安全(最好可以結(jié)合場景來說)?
3.被weak修飾的對象在被釋放的時候會發(fā)生什么?是如何實現(xiàn)的?知道sideTable么?里面的結(jié)構(gòu)可以畫出來么?
4.關(guān)聯(lián)對象有什么應(yīng)用,系統(tǒng)如何管理關(guān)聯(lián)對象?其被釋放的時候需要手動將所有的關(guān)聯(lián)對象的指針置空么?
5.KVO的底層實現(xiàn)?如何取消系統(tǒng)默認的KVO并手動觸發(fā)(給KVO的觸發(fā)設(shè)定條件:改變的值符合某個條件時再觸發(fā)KVO)?
6.Autoreleasepool所使用的數(shù)據(jù)結(jié)構(gòu)是什么?AutoreleasePoolPage結(jié)構(gòu)體了解么?
7.講一下對象,類對象,元類,跟元類結(jié)構(gòu)體的組成以及他們是如何相關(guān)聯(lián)的?為什么對象方法沒有保存的對象結(jié)構(gòu)體里,而是保存在類對象的結(jié)構(gòu)體里?
8.class_ro_t和class_rw_t的區(qū)別?
9.iOS 中內(nèi)省的幾個方法?class方法和objc_getClass方法有什么區(qū)別?
10.在運行時創(chuàng)建類的方法objc_allocateClassPair的方法名尾部為什么是pair(成對的意思)?
11.一個int變量被__block修飾與否的區(qū)別?
12.為什么在block外部使用__weak修飾的同時需要在內(nèi)部使用__strong修飾?
13.RunLoop的作用是什么?它的內(nèi)部工作機制了解么?(最好結(jié)合線程和內(nèi)存管理來說)
14.哪些場景可以觸發(fā)離屏渲染?(知道多少說多少)
iOS 實戰(zhàn)題
1.AppDelegate如何瘦身?
2.反射是什么?可以舉出幾個應(yīng)用場景么?(知道多少說多少)
3.有哪些場景是NSOperation比GCD更容易實現(xiàn)的?(或是NSOperation優(yōu)于GCD的幾點,知道多少說多少)
4.App 啟動優(yōu)化策略?最好結(jié)合啟動流程來說(main()函數(shù)的執(zhí)行前后都分別說一下,知道多少說多少)
5.App 無痕埋點的思路了解么?你認為理想的無痕埋點系統(tǒng)應(yīng)該具備哪些特點?(知道多少說多少)
6.你知道有哪些情況會導(dǎo)致app崩潰,分別可以用什么方法攔截并化解?(知道多少說多少)
7.你知道有哪些情況會導(dǎo)致app卡頓,分別可以用什么方法來避免?(知道多少說多少)
網(wǎng)絡(luò)題
1.App 網(wǎng)絡(luò)層有哪些優(yōu)化策略?
2.TCP為什么要三次握手,四次揮手?
3.對稱加密和非對稱加密的區(qū)別?分別有哪些算法的實現(xiàn)?
4.HTTPS的握手流程?為什么密鑰的傳遞需要使用非對稱加密?雙向認證了解么?
5.HTTPS是如何實現(xiàn)驗證身份和驗證完整性的?
6.如何用Charles抓HTTPS的包?其中原理和流程是什么?
7.什么是中間人攻擊?如何避免?
架構(gòu) & 設(shè)計題
1.MVC和MVVM的區(qū)別?MVVM和MVP的區(qū)別?
2.面向?qū)ο蟮膸讉€設(shè)計原則了解么?最好可以結(jié)合場景來說。
3.可以說幾個重構(gòu)的技巧么?你覺得重構(gòu)適合什么時候來做?
4.你覺得框架和設(shè)計模式的區(qū)別是什么?
5.看過哪些第三方框架的源碼,它們是怎么設(shè)計的?設(shè)計好的地方在哪里,不好的地方在哪里,如何改進?(這道題的后三個問題的難度已經(jīng)很高了,如果不是太N的公司不建議深究)
數(shù)據(jù)結(jié)構(gòu)&算法題
1.鏈表和數(shù)組的區(qū)別是什么?插入和查詢的時間復(fù)雜度分別是多少?
2.哈希表是如何實現(xiàn)的?如何解決地址沖突?
3.排序題:冒泡排序,選擇排序,插入排序,快速排序(二路,三路)能寫出那些?
4.鏈表題:如何檢測鏈表中是否有環(huán)?如何刪除鏈表中等于某個值的所有節(jié)點?
5.數(shù)組題:如何在有序數(shù)組中找出和等于給定值的兩個元素?如何合并兩個有序的數(shù)組之后保持有序?
6.二叉樹題:如何反轉(zhuǎn)二叉樹?如何驗證兩個二叉樹是完全相等的?
喜歡出的和不喜歡出的題
不難看出,整套面試題中的iOS部分占比其實并不大(三分之一),因為筆者認為:
高級 iOS 開發(fā) = 高級開發(fā) + (高級) iOS 開發(fā)。
而其中高級開發(fā)的部分應(yīng)該作為優(yōu)先考核的內(nèi)容,目的在于首先要驗證面試者是否具備高級開發(fā)必備的基本素質(zhì)。這部分知識的掌握程度會直接影響一個開發(fā)者的研究和設(shè)計能力,包括橫向和縱向的。而筆者個人覺得后面的(高級) iOS 開發(fā)的部分僅僅考查的是面試者對于 iOS 本身的理解程度(API,系統(tǒng),開發(fā)工具等等)。
在這套里面,筆者個人最喜歡的幾道題是:
1.iOS SDK 里面有哪些設(shè)計模式的實踐?
2.說一說你對線程安全的理解?
3.你知道有哪些情況會導(dǎo)致app崩潰,分別可以用什么方法攔截并化解?
4.看過哪些第三方框架的源碼,它們是怎么設(shè)計的?
5.可以說幾個重構(gòu)的技巧么?你覺得重構(gòu)適合什么時候來做?
這道題一箭雙雕,不僅考察了面試者對設(shè)計模式這種通用性知識的了解,還可以考察其對iOS SDK的熟悉和思考程度。這里可以簡單提幾個:單例:UIApplication;觀察者模式:KVO;類簇:NSNumber;裝飾者模式:分類;命令模式:NSInvocation;享元模式:UITableviewCell(UITableview的重用)。還有更多,有興趣的讀者可以看一下《Objective-C 編程之道》這本書,它介紹了很多在 iOS SDK中使用的設(shè)計模式。
這道題我看到網(wǎng)上有些答案是錯的,說的大概的意思是“同一時刻只有一個線程訪問”。但是如果按照這個定義的話,那么那些無法改變的常量就不算是線程安全的了,所以顯然這類定義就是錯的。所以說學(xué)東西要具備批判性思維,尤其是看博客的時候,很多情況需要自己想想,主動去認證,去思考。
導(dǎo)致app崩潰的原因有很多,比如向某個對象發(fā)送其無法響應(yīng)的方法,數(shù)組越界,集合類中添加nil對象,string訪問越界,KVO不合理的移除關(guān)聯(lián)key(KVO導(dǎo)致的崩潰不僅僅這一種原因)等。而崩潰非常影響用戶體驗,所以筆者認為一名高級 iOS 開發(fā)應(yīng)該具備避免這些崩潰的能力,起碼至少也要知道這些容易導(dǎo)致崩潰的場景。
看一些優(yōu)秀開源框架的代碼,梳理實現(xiàn)思路和細節(jié)可以幫助我們提高在類似場景下設(shè)計系統(tǒng)的能力。其實道理很簡單,小時候?qū)W習(xí)寫作文的辦法是什么?- 就是背誦課文而已啊。因為寫作是一種輸出,所以如果你沒有好詞好句的積累(輸入),自然寫不出辭藻豐富的文章。寫代碼也是一樣的道理~
重構(gòu)的能力是筆者非??粗氐哪芰?。其實筆者個人認為關(guān)于重構(gòu)的技巧可以早早學(xué)習(xí),在后面寫代碼的時候盡可能做到一步到位(如果在排期允許的情況下),而且也對設(shè)計代碼方面能力的提高有幫助:怎樣才能設(shè)計出一個低耦合,高內(nèi)聚,易擴展,易修改的系統(tǒng)?有專門的一本書來介紹重構(gòu):《重構(gòu) 改善既有代碼的設(shè)計》。
上面說了筆者喜歡考察的問題,下面說一下筆者不喜歡考察的是哪些問題:
1.如何查詢線上的崩潰?
2.了解發(fā)布流程么?幾個證書的區(qū)別?
3.有沒有做過支付/地圖/分享?
4.dysm文件是什么,有什么作用?
筆者不考察這類問題的原因有兩個:
1.這類問題考查不了面試者作為一名程序員的基本素質(zhì),因為其考察的內(nèi)容僅僅局限于iOS本身。
2.這類問題往往是“做過即知道”,更沒辦法量化能力。在實際開發(fā)中遇到了就做過了;就算沒遇到,沒做過,筆者也相信一名優(yōu)秀的程序員在第一次也會高效地做好。
建議準備數(shù)據(jù)結(jié)構(gòu)和算法題
在本文的最后說一下數(shù)據(jù)結(jié)構(gòu)和算法題。
\這類問題是比較大的公司喜歡考核的內(nèi)容,也就是說大部分公司其實并不考(但是如果了解的話是會加分的)。但是筆者個人認為如果時間上允許,多少還是準備一些會比較好。除了應(yīng)對面試,其實算法方面的學(xué)習(xí)會對編程能力的提高有幫助,這一點筆者自己深有體會:
在刷題和學(xué)習(xí)的過程中漸漸能夠感覺到對代碼的理解能力提高了很多,尤其是鏈表題可以強化對指針操作的理解,而且對執(zhí)行條件的檢查,邊界問題的處理能力也提升了一些~
好了,這套題就分享到這里了,在文章后面也建議大家平時注意數(shù)據(jù)結(jié)構(gòu)和算法方面的學(xué)習(xí)。和上一篇一樣,這篇博客主觀方面的內(nèi)容還是多一些的,還是希望讀者可以多多和我交流~
作者:J_Knight_
來源:掘金