實習生面試相關-b

面試要準備什麼

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

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

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

出於這種考慮,我在文章最後的複習資料中,提供了用於學習相關基礎知識的書籍,若是您剛好是 iOS 開發者,還能夠閱讀我收集的一些高質量文章,正確性比較有保證(我寫的除外)。ios

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

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

個人面試經歷

扯了這麼多,終於進入正題了,分享一下個人面試經歷。題目以下,破折線後面是簡單的解決思路github

百度

一面:約 1.5 小時

首先是四個算法題:面試

  1. 不用臨時變量怎麼實現 swap(a, b)——用加法或者異或均可以
  2. 二維有序數組查找數字——劍指 offer 第 3題
  3. 億級日誌中,查找登錄次數最多的十個用戶——(不肯定對不對,個人思路是)先用哈希表保存登錄次數和ID,而後用紅黑樹保存最大的十個數。劍指 offer 第 30題
  4. 簡述排序算法——快排,partion 函數的原理,堆排(不穩定),歸併排序,基數排序。

而後有一個智力題,沒完整的答出來,好像影響不是很大。正則表達式

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

  1. 說說你對 OC 中 load 方法和 initialize 方法的異同。——主要說一下執行時間,各自用途,沒實現子類的方法會不會調用父類的?
  2. 說說你對 block 的理解。—— 三種 block,棧上的自動複製到堆上,block 的屬性修飾符是 copy,循環引用的原理和解決方案。
  3. 說說你對 runtime 的理解。——主要是方法調用時如何查找緩存,如何找到方法,找不到方法時怎麼轉發,對象的內存佈局。
  4. 說說你對 MVC 和 MVVM 的理解。—— MVC 的 C 太臃腫,能夠和 V 合併,變成 MVVM 中的 V,而 VM 用來將 M 轉化成 V 能用的數據。
  5. 說說 UITableView 的調優。——一方面是經過 instruments 檢查影響性能的地方,另外一方面是估算高度並在 runloop 空閒時緩存。
  6. 談談你對 ARC 的理解。ARC 是編譯器完成的,依靠引用計數,談談幾個屬性修飾符的內存管理策略,什麼狀況下會內存泄露。

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

二面:約 0.5 小時

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

  1. 野指針是什麼,iOS 開發中什麼狀況下會有野指針?——野指針是不爲 nil,可是指向已經被釋放的內存的指針,不知道何時會有,若是有知道的讀者還望提醒。
  2. 介紹 block。—— (接第一問) 我讓面試官提示我一下何時會有野指針,他說用 block 時,我表示仍是不知道,只知道 block 會有循環引用。因而就扯回了一面的問題。
  3. 說說你是怎麼優化 UITableView 的。——仍是一面的問題。。。。。。。。。。。

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

三面:北京 onsite,約 2.5 小時

首先是給一個小時,手寫算法兩個算法題。接下來問了 TCP 握手相關的。最後問了 OC 的一些細節問題。

網易

筆試

主要是計算機方面的大雜燴,涉及操做系統,網絡,移動開發,算法等。難度不大,目測是爲了淘汰渾水摸魚的人,就不列出題目了,算法有三題,直接在線寫(木有 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. ARC 會對代碼作什麼優化?——好比 NSString *s2 = s1; s2 = nil 這樣的語句,可能就不會有 retainrelease 方法了。
  3. 介紹一下 MVVM 和 RAC。——多是我簡歷的某個角落寫了用過 RAC,被挖出來了,大概談了一下,結果面試官問我數據的雙向綁定怎麼作,bind 函數了解過麼,果斷說已經忘了😂😂😂
  4. 介紹本身用過哪些開源庫。——Masonry 和 SnapKit,AFNetWorking,MKNetworkKit,Alamofire,Mantle,SDWebImage
  5. 若是讓你寫,你能實現麼?——固然不能,否則還要實習?
  6. 讀過某個庫的源碼麼?——扯了一點 SDWebImage,後來被告知這個庫用了 runloop 來保證滑動是加載數據的流暢性,本身看了源碼後表示沒有發現,惟一用到 runloop 地方是保證後臺線程一直跑,也有多是我理解錯了,若是錯誤歡迎指正。
  7. SDWebImage 下載了圖片後爲何要解碼?——當時矇住了,面試官很 nice 的解釋了一下,說是要把 png 文件創建一個什麼內存映射,目前還不太懂,有空研究一下。

原本覺得面的這麼差確定是掛了,沒想到仍是過了一面。過了不到一個小時,HR 電話打過來,約了兩天後二面。

二面

純數學和算法:

  1. 下面這段代碼的輸出結果是:

    int main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf(「%d,%d」,*(a+1),*(ptr-1)); }

    答案是 2 和 5。a 是指向數組開頭元素的指針,a + 1 就是指向下一個元素的指針,因此星號求值之後是 2。&a 至關因而數組的指針,&a + 1 是數組後面一個數組的指針,而後轉換成int *類型是 5 這個數字後面的一個數字的指針。再減一就是指向 5 的指針,因此星號求值之後是 5。

  2. 某個地方天氣有以下規律:若是第一天和次日都不下雨,則第三天下雨的機率爲30%;若是第一天和次日中有任 意一天下雨,則第三天下雨的機率爲60%。問若是週一週二都沒下雨,那麼週四下雨的機率爲_

    簡單的機率題,答案是:30% * 60% + 70% * 30% = 39%

  3. 某癡迷撲克的小團體喜歡用23456789TJQKA來計數,A後面是22,23,...,2A,32,...,AA,222,... 依次類推。
    請用C/C++或Java寫個程序,將用字符串表示這種計數法轉換成字符串表示的10進制整數。其中,該計數法的2就對應於十進制的2,以後依次遞增。C/C++函數接口: char pokToDec(char )

    個人解決思路是進制轉換,相似於 16 進制轉換 10 進制這種,最後再把數字轉成 char * 類型。

而後好像沒結果了,多是編程實現太渣了?

其餘我知道的面試題

阿里一面:

  1. MVC 具備什麼樣的優點,各個模塊之間怎麼通訊,好比點擊 Button 後 怎麼通知 Model?
  2. 兩個無限長度鏈表(也就是可能有環) 判斷有沒有交點
  3. UITableView 的相關優化
  4. KVONotificationdelegate 各自的優缺點,效率還有使用場景
  5. 如何手動通知 KVO
  6. Objective-C 中的 copy 方法
  7. runtime 中,SELIMP 的區別
  8. autoreleasepool 的使用場景和原理
  9. RunLoop 的實現原理和數據結構,何時會用到
  10. block 爲何會有循環引用
  11. 使用 GCD 如何實現這個需求:A、B、C 三個任務併發,完成後執行任務 D。
  12. NSOperationGCD 的區別
  13. CoreData 的使用,如何處理多線程問題
  14. 如何設計圖片緩存?
  15. 有沒有本身設計過網絡控件?

阿里二面:

  1. 怎麼判斷某個 cell 是否顯示在屏幕上
  2. 進程和線程的區別
  3. TCPUDP 區別
  4. TCP 流量控制
  5. 數組和鏈表的區別
  6. UIView 生命週期
  7. 若是頁面 A 跳轉到 頁面 B,A 的 viewDidDisappear 方法和 B 的 viewDidAppear 方法哪一個先調用?
  8. block 循環引用問題
  9. ARC 的本質
  10. RunLoop 的基本概念,它是怎麼休眠的?
  11. Autoreleasepool 何時釋放,在什麼場景下使用?
  12. 如何找到字符串中第一個不重複的字符
  13. 哈希表如何處理衝突

面試收穫

1. 算法題怎麼答

面試官可能會問到你聞所未聞的算法,這時候你不該該本身瞎想,而是先和麪試官把問題討論清楚。要知道,經過溝通弄明白複雜的問題也是一種能力,在和麪試官交流的過程當中,不只僅能夠搞清楚題目真正的意思是什麼,還能夠展示本身良好的交流溝通能力。因此千萬不要由於緊張或者害羞而浪費此次大好的機會。

有些題目似曾相識,可是暫時沒有思路。這時候不妨告訴面試官,給我一些時間思考這個題。而後不要急,不要慌,就當他不存在,拿出紙和筆慢慢算(這充分說明了面試戴耳機的重要性)。你必定要堅決一個信念:「任何一道稍微有難度的算法題,除非作過,不然必定是須要時間想的」。因此,合理的安排思考時間吧。若是十幾分鍾都想不出來,能夠直接放棄。

有時候面試官會要求在線編程,相信我,他不會無聊到盯着你的代碼看的,面試官通常都很忙,他也有本身的工做要完成,因此你就當是用本身的 IDE 就好。在線編程每每是一箇中等難度的問題,因此不要本身嚇唬本身。同時要注意代碼格式的規範,適當的註釋,提早編寫好測試用例等,即便沒有解決問題,也至少要把本身良好的編程習慣展現給面試官。

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

這個問題有多是面試官故意說得含糊不清,考察你的交流能力,也有多是無心的,或者是你的理解方式出現了誤差。無論是以上哪一種問題,你都應該先和麪試官交流,直到你搞懂了面試官要問你什麼,而不是按照本身的理解說了一堆無用的東西。

舉個例子,面試官可能會問了一道算法題:「如何判斷兩個無限長度的鏈表是否有交點?」。對於「無限長度」能夠有不一樣的理解,若是真的是有無窮多個節點,那顯然這個問題是沒法解決的。但若是鏈表僅僅是有環,那麼仍是能夠解決的。若是面試官的本意是鏈表有環,但你錯誤的理解成了無窮多個節點,那麼必然會致使沒法回答這個問題。並且這並不是能力不足,而是屬於交流溝通方面的失誤,這也正是我想分享的「技巧」。

還有一些問題,雖然你沒有接觸過,可是因爲對相似的問題或者狀況有過思考,因此能夠合理假設。好比面試官問 「ARC 會對代碼作什麼樣的優化?」。咱們知道 ARC 的本質就是在合適的地方插入 retainrelease 等方法,那麼就應該從這個角度出發去思考問題。

顯然分別執行 retainrelease 操做是沒有必要的,那麼就能夠構造出相應的例子:

NSString *s1 = @"hello"; NSString *s2 = s1; NSString *s2 = nil;

因爲這種問題咱們沒有真正實踐過,因此能夠委婉的告訴面試官:「根據個人推理,可能會有……」。

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

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

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

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

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

4. 準備殺手鐗

除了可以回答上面試官的問題之外,我建議本身準備一兩個殺手鐗級別的話題。所謂的殺手鐗,至少具有如下幾個特徵:

  • 你親自動手試驗過。所謂實踐是檢驗真理的惟一標準,數據是不會說謊的。
  • 問題有足夠的深度。一面的面試官多是你的直接上司,二面通常就是更改級別的。你的深度必定要遠超其餘面試者,讓一面面試官以爲本身沒有十足把握,讓二面面試官以爲這是一個好話題,本身的手下都不必定能有這麼獨到深入的看法。
  • 你對這個問題理解的足夠深刻,不管是廣度仍是深度都達到必定水平。

以 iOS 中的 UITableView 的調優爲例,我自認爲對它有必定的理解,同爲 iOS 開發者的讀者能夠閱讀這篇文章:UIKit性能調優實戰講解,同時我還仔細研究了 sunnyxx 大神的 優化UITableViewCell高度計算的那些事

這一類的話題一般須要仔細研究官方文檔,iOS 開發者還能夠觀看 WWDC 視頻,而後花上充足的時間去總結。好比我寫 iOS自定義轉場動畫實戰講解 這篇文章就花了至少三天時間,包括大年初一一成天。

因爲此類話題數量很少,因此準備一個或數個便可,面試時能夠有意識的將面試官引導到這些話題上去,從而充分的展現本身。

5. 心態

一般狀況下,面試結果都會在 1 - 3 天內知道。有的面試官會當場告訴你經過了,有的公司面試結束後幾個小時就能出結果。

但有些時候,因爲某些緣由(我也不清楚。。。。多是比較忙?),你遲遲沒法獲知面試結果。這時候你能夠選擇耐心等待,獲知直接給 HR or 內推者發送郵件。通常來講面試結束後三天還沒收到通知,你能夠發送郵件詢問或者再等等。

複習資料

對於讀到這一段的讀者,爲了感謝你耐心的聽我廢話了這麼久,送上一波精心整理的乾貨和資料。不敢說徹底沒有錯,可是應該比本身去查要靠譜得多。主要涉及算法、網絡、操做系統、Objective-C 和 iOS 五個方面。若是你不是 iOS 開發者,相信前三部分的資料也或多或少可以幫上你。

算法

這一部分的內容主要分爲如下幾個部分:字符串、數組與查找、鏈表、樹以及其餘基礎問題。

總的來講,算法問題能夠分爲如下三類:

  1. 基礎問題:即便是新手,一眼看過去就有思路,只是實現的時候須要注意細節。
  2. 普通問題:這些問題一般屬於以上分類中的某一類,須要面試者掌握一些常見的思路,好比遞歸、動態規劃、BFS/DFS、雙指針、二分搜索 等。或者是直接考察數據結構的使用,如:哈希、棧和隊列、鏈表等,若是具有了這些基礎知識,此類題目一般可以比較快速的解決。
  3. 進階問題:這些題的解題思路和普通問題類似,可是須要你事先有對應的知識積累,不然難以直接看出問題的本質。
  4. 疑難雜題:這類問題比較奇怪,解決它之後並不能給別的題目太多幫助,若是時間緊張能夠暫時放棄。

通常來講,一類問題難度不大,面試前簡單複習一下,面試時當心仔細,全面思考便可。二三類問題是面試重點,須要提早準備。第四類問題一般出現較少,即便不會作,對最終評價的負面影響也不會有前三類那麼大。

若是時間充裕,我建議閱讀《劍指 Offer》這本書並配合 Leetcode 來鞏固知識,在個人面試過程當中,出現不少書上的原題或者變體,我自認爲沒有由於算法而影響任何一次面試的成績。若是時間緊張,你也能夠只完成我列出的一些經典題目,在「【】」中標記了我對此題類型的分類,若是加星號表示此題在實際面試中出現過

PS: 最近有小夥伴被問到了哈希表的實現。這能夠理解爲算法,也能夠歸類爲計算機基礎知識。總的來講你至少須要明白哈希值的特色和兩種解決衝突的方式:拉鍊式和開放尋址。

字符串

  1. 【3】最長迴文子串
  2. 【3】最長無重複子串
  3. 【1*】字符串轉數字
  4. 【4】KMP 算法
  5. 【2】字符串全排列
  6. 【2*】翻轉字符串

動態規劃

  1. 【2】揹包問題
  2. 【3】連續子數組的最大和
  3. 【4】實現簡單的正則表達式匹配

數組

  1. 【3】求兩個等長、有序數組的中位數(二分法)
  2. 【4】求兩個不等長、有序數組的中位數
  3. 【3】旋轉數組求最小值【3】旋轉數組求查找某個值是否存在(二分法)
  4. 【4*】每行從左到右,每列從上到下遞增的二維數組中,判斷某個數是否存在(劍指 offer 第 3 題)
  5. 【3*】數組中出現次數超過一半的數字
  6. 【3*】第 k 大的數(拓展:最大的 k 個數)
  7. 【3*】有序數組中某個數字出現的次數(提示:利用二分搜索)

鏈表

  1. 【2】反轉鏈表(使用遞歸和迭代兩種解法,瞭解頭插法)
  2. 【3】刪除鏈表的當前節點
  3. 【3】刪除倒數第 k 個節點
  4. 【1】兩個有序鏈表合併
  5. 【4】複雜鏈表的複製
  6. 【2*】判斷鏈表是否有環
  7. 【3*】兩個鏈表的第一個公共節點(提示:考慮鏈表有環的狀況)
  8. 【3】刪除鏈表中重複節點

  1. 【3】根據中序和後序遍歷結果重建二叉樹【3】根據中序和前序遍歷結果重建二叉樹
  2. 【2】翻轉二叉樹
  3. 【2】從上往下打印二叉樹 (BFS 的思想)
  4. 【3】判斷某個數組是否是二叉樹的後序遍歷結果 (劍指 offer 第 24 題)
  5. 【3】二叉樹中和爲某個值的路徑
  6. 【3*】二叉樹中某個節點的下一個節點 (強烈推薦準備一下,劍指 offer 第 58 題)

  1. 【2】用兩個棧實現隊列【2】用兩個隊列實現棧
  2. 【2】實現一個棧,能夠用常數級時間找出棧中的最小值
  3. 【3】判斷棧的壓棧、彈棧序列是否合法(劍指offer 第 22 題)

排序

瞭解如下排序的時間、空間複雜度,是否穩定,實現原理

  1. 歸併排序、拓展:求數組中的逆序對個數
  2. 快速排序 重點:partion 函數的實現
  3. 堆排序
  4. 數組元素值域已知時,考慮 基數排序桶排序

位運算

  1. 【2】給一個十進制數字,求它的二進制表示中,有多少個 1 (n &= n - 1)
  2. 【3】給一個數組,全部數字都出現了偶數次,只有一個出現了一次,找出這個數
  3. 【4】給一個數組,全部數字都出現了三次,只有一個出現了一次,找出這個數
  4. 【3】給一個數組,全部數組都出現了偶數次,只有兩個數字出現了一次,找出這兩個數

網絡層

根據不一樣的面試崗位,側重點略有不一樣。對 iOS 和 Android 開發者來講,HTTP 考的略少,以 TCP 和 UDP 爲主。其實 UDP 基本上只會考察和 TCP 的區別。

固然還有一些常見的基礎問題,好比 Cookie 和 Session 的考察,POST 和 GET 的考察,HTTPS 的簡單瞭解等。這些問題在個人博客中都有簡單的總結。

總結了一些資料,數字序號越大的資料表示篇幅更長,耗時更久,難度更大,講解更細緻。破折線後表示預計須要多久能夠讀完。

  1. 【博客】個人六篇總結————不到一週
  2. 【書】圖解 TCP/IP————半個月
  3. 【書】TCP/IP 詳解————沒讀過,感受至少須要一個月
  4. 【書】TCP/IP 協議簇————沒讀過,感受至少須要一個月

光讀書是沒有用的,一問到實際問題很容易懵逼,如下是我總結的一些問題:

  1. 簡介 TCP 和 UDP 區別,他們位於哪一層?
  2. 路由器和交換機的工做原理大概是什麼,他們分別用到什麼協議,位於哪一層?
  3. 描述TCP 協議三次握手,四次釋放的過程。
  4. TCP 協議是如何進行流量控制,擁塞控制的?
  5. 爲何創建鏈接時是三次握手,兩次行不行?若是第三次握手失敗了怎麼處理
  6. 關閉鏈接時,第四次握手失敗怎麼處理?
  7. 你怎麼理解分層和協議?
  8. HTTP 請求中的 GET 和 POST 的區別,Session 和 Cookie 的區別。
  9. 談談你對 HTTP 1.1,2.0 和 HTTPS 的理解。

操做系統與編譯

我被問到的操做系統問題不多,因此僅僅總結了一些自認爲比較重要的問題。關於這一部分的知識,推薦閱讀《程序員的自我修養》,若是時間有限,你能夠閱讀個人《程序員的自我修養讀書筆記》,並思考這些問題:

  1. 源代碼是怎麼變成可執行文件的,每一步的做用是什麼?(預編譯,詞法分析,語法分析,語義分析,中間語言生成目標代碼生成,彙編,連接)
  2. 應用層、API、運行庫、系統調用、操做系統內核之間的關係是什麼?
  3. 虛擬內存空間是什麼,爲何要有虛擬內存空間。
  4. 靜態連接和動態連接分別表示什麼,大概是怎麼實現的?
  5. 可執行文件的結構如何?(分爲哪些段)
  6. 它是怎麼裝載進內存的,爲何要分段,分頁,頁錯誤是什麼?
  7. 進程的內存格局是怎樣的?(堆、棧、全局/靜態區,代碼區,常量區)
  8. 堆和棧的區別,函數調用和棧的關係
  9. 進程和線程的區別
  10. 異步和同步,串行,併發,並行的區別
  11. 多併發任務,僅多線程能加快速度麼(不能,會變慢,有線程切換的開銷)
  12. 多個線程之間能夠共享那些數據
  13. 進程之間如何通訊
  14. 介紹幾種鎖,他們的用途和區別

關於多線程相關的,推薦閱讀這篇文章的前面一小部分——iOS多線程編程——GCD與NSOperation總結

關於操做系統和編譯方面的文章,除了讀原書和個人讀書筆記外,還能夠參考這篇文章——修改一個數字破解Mac上的應用

OC

首先兩本必備的神書必定是要讀完的。一本是講 OC 的《Effective Objective-C 2.0》,中文名叫:「編寫高質量 iOS 與 OS X 代碼的 52 個有效方法」。另外一本書叫:《Objective-C 高級編程》。前者講解 OC 中各類細節,後者主要講了 ARC、Block 和 GCD。

光是讀書,思考不夠,很容易在面試時被問懵逼,因此建議一遍嘗試回答面試真題,一邊閱讀如下總結性的文章,重要性不分前後:

  1. 檢測內存泄露
  2. KVO與KVC原理KVO、Notification、Delegate優缺點最推薦的官方文檔
  3. GCD 與 NSOperation
  4. Runtime
  5. block
  6. atomic 線程安全@synchronized
  7. 對象的深淺複製
  8. 招聘一個靠譜的iOS
  9. 消息傳遞機制
  10. 深刻理解Objective-C:Category

強烈推薦第八篇文章,作完這上面的題目基本上能夠應付大多數 OC 方面的問題了。

iOS 開發

  1. RunLoop
  2. Cell 圖片異步加載優化
  3. iOS 函數式編程的實現 && 響應式編程概念
  4. 內存惡鬼drawRect
  5. UIKit 性能調優(主要是UITableView)
  6. 優化UITableViewCell高度計算的那些事
  7. 高性能圖片架構與設計
  8. 輕量化視圖控制器
  9. UIView的生命週期
  10. 高效設置圓角
  11. 事件的傳遞和響應機制
  12. ReactiveCocoa 和 MVVM 入門

其中須要重點了解 runloop,它不只僅是簡單的「跑圈」的 概念,不少問題其實都與它有關,建議認真閱讀 ibireme 大神的總結

其餘面經

  1. 我是如何同時拿到阿里和騰訊offer的
  2. 大三學生拿到阿里,百度實習offer面試經驗分享
  3. 2016年1月TX電面題



文/bestswifter(簡書做者) 原文連接:http://www.jianshu.com/p/ee15c1cf9c16 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。
相關文章
相關標籤/搜索