iOS面試技巧及問題最全梳理,讓BAT的Offer再也不難拿!

序言

目前形勢,參加到iOS隊伍的人是愈來愈多,甚至已經到供過於求了。今年,找過工做人可能會更深入地體會到今年的就業形勢不容樂觀,隨着各大公司秋招的開始,不少小夥伴都行動起來了,我也有幸得到了一份不錯的offer並和你們分享本身的經驗心得。因爲我面試公司比較多,因此天然也是作了這方面的準備,所以這篇總結並不必定適合想去創業公司的同窗。另外,因爲經驗原本就是主觀性極強的東西,加之筆者水平有限,因此若是有不承認的地方,萬望諸君呵呵一笑,拋之腦後。程序員

接下來,我就斗膽分享一下本身在準備和參加面試的過程當中的收穫、對面試的思考,以及一些可能對你們有用的建議。但願能助你們一臂之力!!面試

首先我要問你們幾個問題算法

什麼是面試編程

有些人可能會把面試看的過重,以爲面試過了就能進入大廠,技術和財富兼得……設計模式

我卻是以爲,面試沒有這麼誇張(抱歉作了一回標題黨),它實際上是一次你和麪試官互相瞭解的絕佳機會,藉此機會你還能夠對將來的工做有初步的瞭解。數組

面試自己並不能徹底評價一我的的實力。面試經過的人,也許只是剛好在面試時遇到了本身熟悉的問題,面試不經過,也有多是面試官自身的問題,並不是每一個面試官都具有客觀評價別人的能力。緩存

換句話說,面試沒經過也許是面試官沒有發現你的才華,面試經過了也並不表明你就能勝任工做,由於進入企業以後可不是天天負責回答面試題!安全

因此從這一點來看,面試有點像相親。你滿意我,我滿意你,王八對綠豆——看上眼了,那就一拍即合,不然就分道揚鑣。我本人很是但願可以多幾輪面試(實際並不老是能作到),這樣你們都有充足的時間互相瞭解,決定去留。網絡

網上某些面經中,介紹了一些「裝逼」的方法,還有所謂的「面試技巧」,我是不太承認的。技巧須要有,這是爲了讓你更好的展現本身,而非坑蒙拐騙,無理取鬧,無中生有。我更想展示一個真實的本身,若是面試官不承認,說明咱們沒有緣分,或者說本身的能力還不夠。多線程

面試要準備什麼

有一位小夥伴面試阿里被拒後,面試官給出了這樣的評價:「……計算機基礎,以及編程基礎能力上都有所欠缺……」。但這種籠統的回答並不是是咱們但願的答案,所謂的基礎到底指的是什麼?

做爲一名 iOS 開發者,我所理解的基礎是 操做系統、網絡和算法這三大塊,不一樣的開發方向可能有不一樣的側重,但基礎總的來講就是這些。我不推薦經過去網上看教程來學習這些基礎知識,由於能用短短几篇文章講明白的事情不叫基礎,至少我沒見過寫得這麼深刻淺出的文章。

不知道有多少讀者和我同樣有過這樣的困擾:「我知道某些東西很重要,因此去百度查了資料,可是查到的文章質量不好,正確率沒有保證」。這實際上是正常的,優秀的文章通常都放在優秀的做者的我的博客上,這偏偏是搜索引擎的盲區,因此通常只能搜到 CSDN、博客園這種地方的文章。天然就沒法保證文章質量。因此擁有一個本身的iOS交際圈子就很重要。

在這裏歡迎你們加入個人iOS交流羣659170228,無論是小白仍是大牛,歡迎你們入駐,一塊兒交流成長!

除了準備通用的基礎知識之外,簡歷也是一個很重要的環節。一直很仰慕唐巧老師的猿題庫,無奈簡歷太差,都沒有收到面試邀請。後來好好改了簡歷之後,就沒有這種問題了。關於簡歷的書寫,推薦兩篇文章:如何寫面向互聯網公司的求職簡歷、程序猿簡歷模板。你也能夠參考個人簡歷,沒有亮點,就當是拋磚引玉。

最後,固然是準備好相關崗位的基礎知識了。做爲 iOS 開發者,雖然 Swift 已經發布了快兩年,可是大公司轉向 Swift 的動做還不明顯,因此 Objective-C 幾乎是必備項,Swift 都不必定能算是加分項。iOS 方面的知識也必不可少,雖然招聘信息上寫着若是基礎紮實,零 iOS 基礎也能夠,可是現實每每是比較殘酷的。

在這裏有一些試探性的面試問題不知道你們會答的怎麼樣呢?

  • 您在工程中遇到過什麼很難的問題?不管是特殊的交互方式、複雜動畫、性能、安全問題…… 最後怎麼解決的?

  • 展現您作過最複雜的一個界面 / 本身封裝得比較好的組件,介紹它的結構和爲何這麼作;

  • 您在工程中作過哪些重構?作出了哪些改變,最後的效果如何?

  • 日常工程中用到哪些第三方開源庫?您讀過它們的源碼嗎?講講本身最熟悉的一個開源庫的源碼結構;

  • 下面給您看的這幾張圖是我上一期剛開發完的需求,若是讓您開發的話,您能給出一個估時嗎?其中有什麼難點和風險點嗎?

這些問題的好處是顯而易見的,每一個人都能多少說上幾句。回答大部分是「沒有」、「沒什麼」的基本能夠 pass 了,而優秀的工程師每每有不少內容可聊。

一些面試技巧

在這裏我給各位小夥伴一些建議,開場白很是重要!通常HR開場都會讓你們介紹一下本身的基本狀況,說一說本身作過的項目以及負責過的模塊。在這個環節,我以爲各位應該把以前全部的緊張不安的情緒所有穩定下來,由於我相信這個問題,你們應該已經作好了充分的準備,而且應該要有足夠的勇氣跟自信來回答這些問題。這個階段就有人被淘汰了,有的人表達得結結巴巴,不懂如何描述,或者先後不連貫,想到哪算哪,甚至對他的項目表述的都是一頭霧水。這樣的人在HR眼裏就會以爲他產品需求人員溝通必定會出大問題,誤會和返工少不了,由於他無法表達清楚他作的項目的業務。

此外我以爲你們擴充一下本身的知識廣度是很是有必要的!從iOS的基礎,底層,到音視頻編碼,逆向還有新的AR,coreML,你們對這些技術瞭解多少?也許由於項目經歷所限,你沒機會用過這些技術,可是隨便上一些技術網站,都能瞭解到如今流行什麼,這些技術是爲了解決什麼問題存在的,你看這些技術也說明你注意到了一些問題的存在。視野開闊的人,說明他的求知慾強。也許應聘者不少關於各類技術的回答是錯的,可是HR能看出來你是想過仍是沒想過,是有本身的一套認知仍是胡說八道。你說錯不要緊,咱們團隊裏有懂的人,他之後會給你把觀點改正過來,可是想都沒想過,差距就顯而易見。若是你能瞭解一些AR,coreML的知識 那麼你就會在HR那裏加分很多!

扯了這麼多,讓咱們進入重頭戲

先來梳理一下iOS面試中常常會遇到的一些問題吧!

OC的理解與特性

OC做爲一門面向對象的語言,天然具備面向對象的語言特性:封裝、繼承、多態。它既具備靜態語言的特性(如C++),又有動態語言的效率(動態綁定、動態加載等)。整體來說,OC確實是一門不錯的編程語言。

Objective-C具備至關多的動態特性,表現爲三方面:動態類型(Dynamic typing)、動態綁定(Dynamic binding)和動態加載(Dynamic loading)。動態——必須到運行時(run time)纔會作的一些事情。

簡述內存管理基本原則

以前:OC內存管理遵循「誰建立,誰釋放,誰引用,誰管理」的機制,當建立或引用一個對象的時候,須要向她發送alloc、copy、retain消息,當釋放該對象時須要發送release消息,當對象引用計數爲0時,系統將釋放該對象,這是OC的手動管理機制(MRC)。

目前:iOS 5.0以後引用自動管理機制——自動引用計數(ARC),管理機制與手動機制同樣,只是再也不須要調用retain、release、autorelease;它編譯時的特性,當你使用ARC時,在適當位置插入release和autorelease;它引用strong和weak關鍵字,strong修飾的指針變量指向對象時,當指針指向新值或者指針不復存在,相關聯的對象就會自動釋放,而weak修飾的指針變量指向對象,當對象的擁有者指向新值或者不存在時weak修飾的指針會自動置爲nil。

如何理解MVC設計模式

MVC是一種架構模式,M表示MOdel,V表示視圖View,C表示控制器Controller:

Model負責存儲、定義、操做數據;

View用來展現書給用戶,和用戶進行操做交互;

Controller是Model和View的協調者,Controller把Model中的數據拿過來給View用。Controller能夠直接與Model和View進行通訊,而View不能和Controller直接通訊。View與Controller通訊須要利用代理協議的方式,當有數據更新時,MOdel也要與Controller進行通訊,這個時候就要用Notification和KVO,這個方式就像一個廣播同樣,MOdel發信號,Controller設置監聽接受信號,當有數據更新時就發信號給Controller,Model和View不能直接進行通訊,這樣會違背MVC設計模式。

如何理解MVVM設計模式

ViewModel層,就是View和Model層的粘合劑,他是一個放置用戶輸入驗證邏輯,視圖顯示邏輯,發起網絡請求和其餘各類各樣的代碼的極好的地方。說白了,就是把原來ViewController層的業務邏輯和頁面邏輯等剝離出來放到ViewModel層。

View層,就是ViewController層,他的任務就是從ViewModel層獲取數據,而後顯示。

NSNotification、Block、Delegate和KVO的區別

代理是一種回調機制,且是一對一的關係,通知是一對多的關係,一個對向全部的觀察者提供變動通知;

效率:Delegate比NSNOtification高;

Delegate和Block通常是一對一的通訊;

Delegate須要定義協議方法,代理對象實現協議方法,而且須要創建代理關係才能夠實現通訊;

Block : Block更加簡潔,不須要定義繁瑣的協議方法,但通訊事件比較多的話,建議使用Delegate;

使用block有什麼好處?使用NSTimer寫出一個使用block顯示(在UILabel上)秒錶的代碼

  • 代碼緊湊,傳值、回調都很方便,省去了寫代理的不少代碼。

  • NSTimer封裝成的block,具體實現

  • 實現方法:


有2種方法解決:一個view已經初始化完畢,view上面添加了n個button,除用view的tag以外,還能夠採用什麼辦法來找到本身想要的button來修改button的值

第一種:若是是點擊某個按鈕後,纔會刷新它的值,其它不用修改,那麼不用引用任何按鈕,直接在回調時,就已經將接收響應的按鈕給傳過來了,直接經過它修改便可。

第二種:點擊某個按鈕後,全部與之同類型的按鈕都要修改值,那麼能夠經過在建立按鈕時將按鈕存入到數組中,在須要的時候遍歷查找。

線程與進程的區別和聯繫?

  • 一個程序至少要有進城,一個進程至少要有一個線程.

  • 進程:資源分配的最小獨立單元,進程是具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.

  • 線程:進程下的一個分支,是進程的實體,是CPU調度和分派的基本單元,它是比進程更小的能獨立運行的基本單位,線程本身基本不擁有系統資源,只擁有一點在運行中必不可少的資源(程序計數器、一組寄存器、棧),可是它可與同屬一個進程的其餘線程共享進程所擁有的所有資源。

  • 進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。

  • 進程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。

  • 但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。

多線程編程

  • NSThread:當須要進行一些耗時操做時會把耗時的操做放到線程中。線程同步:多個線程同時訪問一個數據會出問題,NSlock、線程同步塊、@synchronized(self){}。

  • NSOperationQueue操做隊列(不需考慮線程同步問題)。編程的重點都放在main裏面,NSInvocationOperation、BSBlockOperation、自定義Operation。建立一個操做綁定相應的方法,當把操做添加到操做隊列中時,操做綁定的方法就會自動執行了,當把操做添加到操做隊列中時,默認會調用main方法。

  • GCD(`Grand Central Dispatch)宏大的中央調度,串行隊列、併發隊列、主線程隊列;

  • 同步和異步:同步指第一個任務不執行完,不會開始第二個,異步是無論第一個有沒有執行完,都開始第二個。

  • 串行和並行:串行是多個任務按必定順序執行,並行是多個任務同時執行;

  • 代碼是在分線程執行,在主線程嘟列中刷新UI。

多線程編程是防止主線程堵塞、增長運行效率的最佳方法。

  • Apple提供了NSOperation這個類,提供了一個優秀的多線程編程方法;

  • 一個NSOperationQueue操做隊列,至關於一個線程管理器,而非一個線程,由於你能夠設置這個線程管理器內能夠並行運行的線程數量等。

  • 多線程是一個比較輕量級的方法來實現單個應用程序內多個代碼執行路徑。

  • iPhoneOS下的主線程的堆棧大小是1M。第二個線程開始就是512KB,而且該值不能經過編譯器開關或線程API函數來更改,只有主線程有直接修改UI的能力。

定時器與線程的區別;

  • 定時器;能夠執行屢次,默認在主線程中。

線程:只能執行一次。

關於面試問題方面就先梳理到這,固然這確定不是所有隻是一部分,接下來我給你們分享一下個人經歷吧!

這裏就列舉個人兩次面試經歷吧

公司一

一面:約 1.5 小時

首先是四個算法題:

  1. 不用臨時變量怎麼實現 swap(a, b)——用加法或者異或均可以

  2. 二維有序數組查找數字——劍指 offer 第 3題

  3. 億級日誌中,查找登錄次數最多的十個用戶——(不肯定對不對,個人思路是)先用哈希表保存登錄次數和ID,而後用紅黑樹保存最大的十個數。劍指 offer 第 30題

  4. 簡述排序算法——快排partion函數的原理,堆排(不穩定),歸併排序,基數排序。

最後是 iOS 相關,面試官問的很開放,都是談談本身的理解

  1. 說說你對 block 的理解。—— 三種 block,棧上的自動複製到堆上,block 的屬性修飾符是 copy,循環引用的原理和解決方案。

  2. 說說你對 runtime 的理解。——主要是方法調用時如何查找緩存,如何找到方法,找不到方法時怎麼轉發,對象的內存佈局。

  3. 說說你對 MVC 和 MVVM 的理解。—— MVC 的 C 太臃腫,能夠和 V 合併,變成 MVVM 中的 V,而 VM 用來將 M 轉化成 V 能用的數據。

  4. 說說 UITableView 的調優。——一方面是經過 instruments 檢查影響性能的地方,另外一方面是估算高度並在 runloop 空閒時緩存。

  5. 談談你對 ARC 的理解。ARC 是編譯器完成的,依靠引用計數,談談幾個屬性修飾符的內存管理策略,什麼狀況下會內存泄露。

一面的問題很是基礎,主要是算法和 Objective-C,由於準備比較充分,基本上答出來 80% 吧。大約一週後忽然二面。

二面:約 0.5 小時

二面比較忽然,顯示簡單的自我介紹,而後問了三個問題:

  1. 野指針是什麼,iOS 開發中什麼狀況下會有野指針?——野指針是不爲 nil,可是指向已經被釋放的內存的指針,不知道何時會有,若是有知道的讀者還望提醒。

  2. 介紹 block。—— (接第一問) 我讓面試官提示我一下何時會有野指針,他說用 block 時,我表示仍是不知道,只知道 block 會有循環引用。因而就扯回了一面的問題。

  3. 說說你是怎麼優化 UITableView 的。——仍是一面的問題。。。。。。。。。。。

雖然經過了,可是幾乎又問了一遍一面的問題讓我感受對方不太認真。

公司二

筆試

主要是計算機方面的大雜燴,涉及操做系統,網絡,移動開發,算法等。難度不大,目測是爲了淘汰渾水摸魚的人,就不列出題目了,算法有三題,直接在線寫(木有 IDE 表示很憂傷):

  1. 很長一道題,讀了好久纔讀懂,目測是 DFS,可是最後沒時間了,寫了個思路。

  2. 把 "www.zhidao.baidu.com" 這樣的字符串改爲 "com/baidu/zhidao/www"。——老題目了,劍指 offer 的,兩次逆序排列便可。

  3. 求數組中和爲某個值的全部子數組,好比數組是 [5,5,10,2,3] 一共有四個子數組的和是 15,好比 [5,10][5,10][10,2,3][5,5,2,3]。這個就是簡單的遞歸了,分兩種狀況,當前位置的數字在子數組中,以及不在子數組中。

面試

所有是 iOS 題,多是以爲算法已經面過了

  1. 介紹 block。——我提到棧上的 block 在 ARC 下會自動複製到堆上,面試官問我從 iOS 4 仍是 5 開始支持這一特性,表示不知道,我又不是學 OC 歷史的,後來想一想多是公司內部老項目有這個坑

  2. 介紹一下 MVVM 和 RAC。——多是我簡歷的某個角落寫了用過 RAC,被挖出來了,大概談了一下,結果面試官問我數據的雙向綁定怎麼作,bind函數了解過麼,果斷說已經忘了

  3. 介紹本身用過哪些開源庫。——Masonry 和 SnapKit,AFNetWorking,MKNetworkKit,Alamofire,Mantle,SDWebImage

  4. SDWebImage 下載了圖片後爲何要解碼?——當時矇住了,面試官很 nice 的解釋了一下,說是要把 png 文件創建一個什麼內存映射,目前還不太懂,有空研究一下。

面試收穫,注意看!!很是重要!!

1.給本身寫一份很是專業的簡歷

個人建議是,若是你想增長本身的入選機會,那最好仍是花點錢製做一份專業的簡歷。相較於你未來可能獲得的巨大收穫,這真的只是一個小小的投資。

2.研究面試官

當HR聯繫程序員來面試的時候,他老是會事先發電子郵件給他,並附上他的名字和博客地址。可是讓我驚訝的是,當不少小夥伴去面試的時候,他居然對HR仍是一無所知。

舉個正面的例子,當HR在面試時遇到一位開發人員,甚至能對他之前寫的一篇博客或者作的教學視頻上面的內容侃侃而談。

你說HR會推薦哪一個?

面試官也是人,也會有人性的弱點和特色。Dale Carnegie曾說過,要讓別人對你感興趣,最簡單的方法就是你先表達出對對方的興趣。

無論這種方法是否有欠公正,可是若是你想面試成功,那麼我建議你事先最好先好好研究一下你應聘的這家公司和麪試官(若是知道的話)。

當今社會的信息是如此的發達,咱們徹底能夠在貼吧、論壇、微博、博客上找到任何人的資料。即便你只是大體瀏覽一番,也會讓你受益良多。

3.得到內部推薦

知道找工做最簡單的方法是什麼嗎?那就是得到內部推薦。

這不但能夠增長面試機會,還能提高40%的錄用概率。

講一下我之前的一次經歷吧,我找到了一家心儀的公司。而後直接投簡歷?NONO,猜猜我是怎麼作的吧?

首先我找到一名和我有共同想法和意見的開發人員,而後開始關注他的博客。

接着我在他的博客中留言、發表建議,而且表現出對他的工做和公司很是感興趣的想法。最後我成功拿到了這個寶貴的內部推薦資格。

不少程序員會說,「但是,某某某公司裏面的人我一個也不認識啊」。若是你想就此放棄,那當我什麼也沒說,若是你願意試試,我敢打賭,你總能想出一種方法達到你的目的。

不過這有個祕訣,那就是首先你得在網上建立本身的「名片」——讓別人有了解你的機會,因此do it now吧。

4. 學會解決算法問題

這是每個開發人員都應該具有的重要技能,並且真要掌握起來也並不是那麼難。

在不少面試中,都會有這樣的問題,要求你在白板或者電腦上解決編程問題,可是許多程序員,即便是那些很是優秀的程序員,都會一會兒大腦一片空白,徹底理不出思路來。

若是你能花時間學會如何解決這種類型的面試問題,那麼下次再碰到這種場景,就不會這麼緊張了。

咱們會緊張其實和怯場無關,主要是由於咱們不熟悉這些問題,也沒有自信能解決這種問題。

在這方面創建起自信以後,你就不再會緊張了。

5.活力洋溢地回答問題

只用一個字或者一句話,照本宣科平平無奇地回答問題,或許在技術上是正確的,可是你忘了應該藉此機會好好展現本身的激情——這纔是一個開發人員能帶給團隊的最大正能量。

舉個例子說,若是我問你什麼是多態性,我不是要你按照課本中的定義重複給我聽,我但願你能就這個主題闡述一下,而後咱們能夠更深刻地聊一聊。

6.當心陷阱問題

你爲何換工做?

說說你最大的優勢和缺點。

最近一次你是如何解決和同事之間發生的技術分歧的?

在回答問題以前,你最好明白麪試官問這些問題的目的,掌握如何回答這類問題的技巧。

就先說說第一個問題吧「你爲何換工做?」

在大多數狀況下,面試官想知道的是你是不是一個愛說三道4、慣於誹謗抨擊僱主的人。因此千萬不要上當。

7. 遇到真的不會的問題怎麼處理

遇到不會的問題果斷認可啊。若是是基本問題,好比問你哈希表怎麼實現,你說不會,那麼此次面試可能就懸了。若是是有必定難度的問題,那麼你認可不會,也是一種明智之舉,畢竟人無完人,一個問題不會並不能全盤否認一我的的能力。

可是比較糟糕的一種狀況是,面試者因爲過度緊張,擔憂答不上面試官的問題會有嚴重後果,因此嘗試着去敷衍面試官。好比:「我猜是 xxx 吧」,「我以爲多是 ……」,更有甚者直接裝逼:「這個我試過,不就是 xxx 麼」。要知道,此時的你,因爲緊張,在心態上已經輸給了面試官,更況且面試官問你的問題必定是他有把握的,你以爲這時候你負隅頑抗會有幾成勝算呢?

因此,面試官問我「堆排序」的細節時,因爲我當時忘了堆排序是怎麼實現的,因此我直接告訴他我記不清了。另外一個主動認輸的例子是面試官問我 RAC 如何實現雙向綁定,我告訴他這個是我當時學習的時候寫過的 demo,由於不經常使用,已經只記得一些簡單的概念了。

最後,還須要保持一個平穩的心態:「面試時盡力就好,遇到本身不會的問題也是正常狀況」。若是面試者順利答對了全部問題,不免會讓面試官感到一絲尷尬,面試者也有可能會產生一些別的情緒。因此,咱們要作的只是把本身的能力展現給面試官,作到不驕不躁。

今天給你們的分享就到這吧!你們若是以爲寫的不錯能夠點一波關注收藏!還能夠加入個人iOS交流羣659170228,你們一塊兒交流成長!!

相關文章
相關標籤/搜索