iOS 開發(fā)面試指南:67 個必知問題!

一般性問題

1.到目前為止,你參與過哪些項目?都用到了哪些技術(shù)?你就詳細講講某些有趣的項目,談?wù)勥@些項目用的是什么技術(shù)和框架就可以。

2.你是否參與過開源項目?你在其中擔任什么角色?即使你只是某個開源項目的貢獻者,這也會為你大大加分。如果你現(xiàn)在想得到第一份工作,開源項目是一種能證明你技術(shù)的好方法。如果你是某個廣受歡迎repo的維護者,那就更好了。

3.你以前所在的團隊有多大?你有過在任何一個項目中擔任leader的經(jīng)歷嗎?這個問題只是為了了解你過去是獨自工作,在一個較大的團隊中工作,遠程協(xié)作,還是僅與本地的開發(fā)者合作。

4.你知識儲備的來源是什么?平時會看一些博客或者播客(podcast)內(nèi)容嗎?舉幾個例子吧。如果你平時確實看,那就表明編程不僅是你的工作,還是你的一個業(yè)余愛好,所以相比其他不做這些事情的人,你就是更好的人選。

5.你是否曾有過Scrum / Agile開發(fā)經(jīng)歷?你是怎么看待這種開發(fā)方式的?在你看來,什么時候該用,什么時候不該用?這只是一個簡短的問題,是為了了解你是否懂得Scrum自有其適用的地方,但不必一直使用。

6.你對code review有何看法?這也是一個簡短的問題,用來測試你是否屬于看重code review的那一類人。

7.你是否會去參加一些會議或一些當?shù)氐囊娒鏁窟@些活動中你最喜歡哪個?我認為這并不是什么嚴肅的問題——如果你不喜歡參加,并不能代表你是一個糟糕的開發(fā)者,你可能只是內(nèi)向而已。但是,如果你可以在那種會議上為公司做宣傳,或者發(fā)表個演講的話,那公司是會很喜聞樂見的。

Swift和Objective-C

iOS開發(fā)并不僅僅意味著Swift。很多項目的某些部分仍然在用Objective-C——甚至有的項目完全是用Objective-C編寫的。而且,在某些(不太常見)的情況下,C和C ++技能也可能會有用。
但是,我倒不是很擔心這一點,因為如果面試針對某些特定的需要這些知識的項目,那么職位描述里面很有可能會提到。另外,一些有關(guān)Bash和Ruby的基礎(chǔ)知識可能會給你帶來巨大的優(yōu)勢,因為有時我們可能需要寫一些腳本。
下面這些問題的順序是隨機的。

8.你如何描述Swift這門語言?這是一種面向協(xié)議編程的類型安全語言。然后對方可能會追問一些后續(xù)的問題,可能會讓你進一步解釋“面向協(xié)議”的含義等等。

  1. var和let有什么區(qū)別?你會在struct中選擇哪個作為property?為什么?第一個是非?;A(chǔ)的問題,而第二個可能比較棘手,因為它需要視情況而定。

10.什么是lazy property?如果你寫Swift代碼已經(jīng)有一段時間了,那至少要使用過一次lazy property,這樣才能更好地了解它的優(yōu)點和缺點。

11.什么是optional?其背后的機制是什么?什么是unconditional unwrapping ?這個的答案你大概知道。

12.如何unwrap一個optional值?附加問題:什么是optional chaining,optional binding以及nil-coalescing operator?舉例說明你會在何種情況下選用哪種方法。這道題很簡單,但目的只在于看你是否知道其中的區(qū)別,而guard并不總是首選。

  1. class和struct有什么區(qū)別?舉例說明分別什么情況下應(yīng)該選用。你可以深入講講這一點,例如,它們是如何保存在內(nèi)存中的(棧/堆)等等。

14.什么是closure?這個你應(yīng)該知道的吧?

15.weak和unowned是什么意思?二者有什么不同?最好知道它們之間的區(qū)別以及何時使用unowned。雖然你每次都用weak可能也ok,但unowned也是自有其用途的。

16.舉例說明從標準庫進行收集操作的方法。map和reduce各有什么作用,以及這些方法如何在日常開發(fā)中發(fā)揮作用?

17.什么是autoclosure?這可能看起來像是一個簡單的問題,但autoclosure的內(nèi)容可能比你想象的要多——比如,它是如何影響性能的。

  1. mutating關(guān)鍵字是什么意思?舉一些例子說明一下。

19.escaping和unescaping分別是什么意思?這是個簡單的問題。但你還記得哪個是默認選項嗎?

20.(如果求職者會Objective-C):Swift和Objective-C有什么區(qū)別?你分別喜歡這兩種語言的什么特性?隨便說點什么都行——如果你對兩種語言都有經(jīng)驗,你就會知道在每種語言身上你最喜歡或最想念的是什么。

21.你聽說過method swizzling嗎?是什么意思?在Swift中可以用嗎?魔法……隨便說點你知道的信息——例如為什么這樣是危險的,等等。

  1. NSArray和NSSet有什么區(qū)別?不要只說集合包含獨特的元素,還要進一步說明它在不同情況下是如何表現(xiàn)的。

23.(如果求職者會Objective-C):Objective-C中的atomic/nonatomic是什么?

24.什么是KVO和KVC?這是另外一個很大的題目,所以至少要了解一些基本知識。

25.什么是應(yīng)用程序和控制器生命周期?這是一個簡短的問題。

26.什么是核心數(shù)據(jù)(Core Data)?這是一個很大的話題——你可能永遠都用不到Core Data,但也要了解一些基本知識。

27.你在架構(gòu)上有什么經(jīng)驗?你最喜歡哪種,為什么?你可能需要了解MVVM(這是最常見的一種),因此,請閱讀此類內(nèi)容以及與coordinator有關(guān)的內(nèi)容。

28.你是否會將struct或class用在MVVM中的視圖模型里?視圖模型不一定總是一個class。

29.如何管理代碼中的依賴(dependency)?你是使用依賴注入框架/工具,還是手動進行?或者你只使用單例(singleton)?

30.什么是REST?POST和GET方法有什么區(qū)別?這個是必備知識。

31.你是否編寫過網(wǎng)絡(luò)層?簡要說明你以前是如何做的/將要如何做?你只需根據(jù)你自己的經(jīng)驗來解釋即可。

32.你是否使用過Alamofire,或其他任何網(wǎng)絡(luò)框架?有些人用網(wǎng)絡(luò)框架,有些人不用。你平時用不用?

33.如何在Swift中解析JSON?如何在Swift中解析XML?JSON的那一題很簡單。如果你知道的話,也順便討論一下你的密鑰解碼策略。XML有點被人們遺忘了,但是對于某些項目,你可能仍然需要XML。

34.什么是certificate pinning?如何在iOS應(yīng)用程序中實現(xiàn)?這題不會也沒關(guān)系,但是如果知道會很加分!

35.如何允許不安全的連接?這是可行的嗎?能通過應(yīng)用審查嗎?知道什么說什么就行——例如,可以談?wù)勗谑裁辞闆r下是可以做到這一點的。

36.我們應(yīng)該如何處理后臺操作?至少要知道一種方法。

  1. GCD和NSOperation之間有什么異同?GCD可能使用起來更方便,但是知道應(yīng)該何時使用NSOperation是加分項。

38.什么是串行/并行隊列(serial/concurrent queue)?分別舉例說明應(yīng)該何時使用。

39.什么是dispatch group?知道會加分。

40.你最喜歡創(chuàng)建視圖的方式是什么?為什么?界面生成器(Interface builder),代碼約束(constraints in code),手動框架計算(manual frame calculating)——每種都各有什么優(yōu)點和缺點?你傾向于用哪一種,為什么?

41.如何構(gòu)建能夠支持不同屏幕尺寸的視圖?size class,用戶界面的術(shù)語等等

42.單元中的reuseIdentifier是什么,prepareForReuse方法是做什么的?這題你必須會,因為table和collection通常都是應(yīng)用程序中的核心元素。

43.什么是UIStackView?你以前用過嗎?到目前為止你可能已經(jīng)了解堆棧視圖(stack view)了,只需說出你對這個問題的了解即可,例如如何制作動畫,等等。

44.什么是internalContentSize?它真的很好用。

45.你是否曾經(jīng)寫過自定義控制器轉(zhuǎn)換?怎樣才能做到?這個不經(jīng)常用到,但是如果用到了,最好記得back gesture以及如何實現(xiàn)。

46.frame和bounds有什么區(qū)別?這是“面試必問”的一道題。但是有些開發(fā)人員并不知道答案。

  1. Constraint priorities, hugging priority, 以及compression resistance priority:它們是什么,以及它們是如何工作的?希望你不是那類一遇到約束沖突,就把所有約束的優(yōu)先級都設(shè)置為999的人。

48.你在iOS中制作過的最復(fù)雜的動畫是什么?你是怎么做的?如果你做過一些精美的東西,那就自信地說出來吧。

49.在不嵌套多個UIView.animate方法的前提下,如何做出復(fù)雜的動畫?我想我們雖然很少有機會(有需求)去做這件事,但是也許有一天你會需要去做。

50.(如果求職者懂Objective-C):copy和retain之間有什么區(qū)別?也許知道答案的人會逐年減少,但是無論如何,如果你懂Objective-C,大概就會知道。

51.你會怎樣存儲敏感的用戶數(shù)據(jù)?這題只是為了檢查你對數(shù)據(jù)安全性是否有所了解。

52.什么是defer?它們以怎樣的順序被執(zhí)行等等。

53.什么是泛化(generics)?描述一下泛化是如何改善我們的生活的,并從Swift標準庫里舉例說明。

面試問題可能并不僅僅與代碼有關(guān),因此也需要在有關(guān)iOS開發(fā)的一般性知識方面做好準備。

54.請說出在創(chuàng)建一個新項目后,需要先做哪幾件事。拜托了,請不要說你要先設(shè)置CocoaPods。不要誤會,把CocoaPods作為依賴管理器(dependency manager)并沒有錯,但首先應(yīng)該做的不是這個。

55.你用依賴管理器嗎?你更喜歡哪個?這里的答案并沒有好壞——只是為了知道你的偏好而已。但是,最好了解每個管理器都各有什么優(yōu)缺點。

56.什么是配置(debug,發(fā)布)?你是否會創(chuàng)建自定義的配置?我不清楚有多少項目會用自定義配置。無論如何,在某些情況下我們可能會用到。

57.你使用Xcode的工具嗎?哪些?希望你至少會用Leaks。

58.你如何找到并解決內(nèi)存泄漏問題?如果你有響應(yīng)性編程的經(jīng)驗,那么你可以談?wù)劊㈨槺阏f說在響應(yīng)式編程中這種問題更難解決。

59.什么是持續(xù)集成(continuous integration,CI)?你用過嗎?配置過嗎?有很多種類型,最好知道一兩個。

60.你是否有向App Store發(fā)布應(yīng)用程序的經(jīng)驗?你是否曾經(jīng)在app審查方面遇到過任何問題?只需說自己的經(jīng)驗之談即可。如果你曾經(jīng)用IAP發(fā)布過應(yīng)用程序,就可以提一提。如果你曾經(jīng)與審查人員有過什么有趣的對話,也可以說說。

61.你在單元測試方面有過經(jīng)驗嗎?UI測試呢?每個人都說他們會寫測試,但真的如此嗎?如果你曾使用過任何框架來幫助測試,也提一下。

62.你是否曾經(jīng)開發(fā)過測試驅(qū)動項目(TDD)?做過的同學請舉手。

63.你每天都使用的開發(fā)工具有哪些?可以是一些代碼格式化程序或同步器之類的——隨便什么都行。如果你的工具是自己寫的,請務(wù)必提及!

64.什么是SOLID?你能列出并描述這些原則嗎?如果你知道它的含義,就說明你已經(jīng)為面試做好了準備。但是,如果能舉出一些例子,那會更好。

65.什么是聲明式編程(declarative programming)?你是否嘗試過SwiftUI?SwiftUI越來越受歡迎了,誰知道呢,也許幾年后,它將變成寫iOS應(yīng)用程序的唯一方法。因此,最好至少知道它的存在。我認為現(xiàn)在還沒有人會要求開發(fā)者擁有豐富的SwiftUI開發(fā)經(jīng)驗,但是如果你曾嘗試過,那會是加分項。

66.什么是響應(yīng)式編程(reactive programming)?你是否有使用Rx框架和/或Apple’s Combine的經(jīng)驗?Apple也采用這種方式,所以如果你還沒有嘗試過,那么現(xiàn)在正是去了解一些基礎(chǔ)知識的好時機。

67.你為什么要離開原先的工作?你對新工作有什么期待嗎?坦誠地說就可以。你所追求的大概率是更高的薪水,但除此之外,一定還有其他東西吧!
以上只是面試官可能會提的一些問題。

點擊查看原文鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容