天天看點

【ios開發工程師網際網路名企面試】一個iOS程式員的BAT面試經驗和知識點總結

随着各大公司春招的開始,很多小夥伴都行動起來了,我有幸能夠加入百度并和大家分享自己的經驗心得。由于我面試的都是比較大的公司,是以自然也是做 了這方面的準備,是以這篇總結并不一定适合想去創業公司的同學。另外,由于經驗本來就是主觀性極強的東西,加之筆者水準有限,是以如果有不認可的地方,萬 望諸君呵呵一笑,抛之腦後。

接下來,我就鬥膽分享一下自己在準備和參加面試的過程中的收獲、對面試的思考,以及一些可能對大家有用的建議。最後附贈一份大禮包,希望能幫助每位讀者找到自己心儀的工作。

作為 iOS 開發者,雖然 Swift 已經釋出了快兩年,但是大公司轉向 Swift 的動作還不明顯,是以 Objective-C 幾乎是必備項,Swift 都不一定能算是加分項。iOS 方面的知識也必不可少,雖然招聘資訊上寫着如果基礎紮實,零 iOS 基礎也可以,但是現實往往是比較殘酷的。

我的面試經曆

扯了這麼多,終于進入正題了,分享一下我的面試經曆。題目如下, 破折線後面是簡單的解決思路 。

百度

一面:約 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 小時

首先是給一個小時,手寫算法:

  1. 給一個字元串,如何判斷它是否是合法的 IP 位址,比如 “192.168.1.1” 就是合法的。
  2. 說說大數相加的思路,動手寫代碼實作。

沒能寫完,主要是大數相加的時候需要考慮負數,耽擱了一點時間。

然後讓我簡述 TCP 建立和關閉連接配接時,握手的過程。還問了前者為什麼是三次,後者需要四次?

接下來是設計了一個實際場景,為了簡化問題,我們考慮這個問題:假設有 10W 條電話号碼,如何通過輸入電話号碼的某一段内容,快速搜尋出來。比如輸入 

234

 ,以下兩個号碼都會顯示在搜尋結果中:

  1. 123456789000
  2. 188888823400

其實最簡單的解決方案是周遊所有字元串,然後用 KMP 算法。但是這樣的問題是需要周遊 10W 個元素,效率比較低。我想到的是辦法是使用索引。建立 100 個索引(00 到 99),比如輸入 

234

時隻需要在索引 

23

 對應的區域查找即可,可以加快 100 倍速度。但是缺點是插入資料時,需要更新多個索引,資料量會是原來的 10 倍。

目前還沒有想到好的解決方案。有大神提醒說用字典樹,有空研究一番。

最後問了 OC 的數組中,添加 

nil

 對象會有什麼問題。當時沒答上來,現在想想很不應該,因為數組是以 

nil

 結尾的,如果添加了 

nil

 ,後續就不能添加對象了。

網易

筆試

主要是計算機方面的大雜燴,涉及作業系統,網絡,移動開發,算法等。難度不大,目測是為了淘汰渾水摸魚的人,就不列出題目了,算法有三題,直接線上寫(木有 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

     這樣的語句,可能就不會有

    retain

     和 

    release

     方法了。
  3. 介紹一下 MVVM 和 RAC。——可能是我履歷的某個角落寫了用過 RAC,被挖出來了,大概談了一下,結果面試官問我資料的雙向綁定怎麼做, 

    bind

     函數了解過麼,果斷說已經忘了:joy::joy::joy:
  4. 介紹自己用過哪些開源庫。——Masonry 和 SnapKit,AFNetWorking,MKNetworkKit,Alamofire,Mantle,SDWebImage
  5. 如果讓你寫,你能實作麼?——當然不能,不然還要實習?
  6. 讀過某個庫的源碼麼?——扯了一點 SDWebImage,後來被告知這個庫用了 runloop 來保證滑動是加載資料的流暢性,自己看了源碼後表示沒有發現,唯一用到 runloop 地方是保證背景線程一直跑,也有可能是我了解錯了,如果錯誤歡迎指正。
  7. SDWebImage 下載下傳了圖檔後為什麼要解碼?——當時蒙住了,面試官很 nice 的解釋了一下,說是要把 png 檔案建立一個什麼記憶體映射,目前還不太懂,有空研究一下。

本來以為面的這麼差肯定是挂了,沒想到還是過了一面。過了不到一個小時,HR 電話打過來,約了兩天後二面。

二面

純數學和算法:

  1. 下面這段代碼的輸出結果是:
    c
    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. KVO

     、 

    Notification

     、 

    delegate

     各自的優缺點,效率還有使用場景
  5. 如何手動通知 

    KVO

  6. Objective-C 中的 

    copy

     方法
  7. runtime 中, 

    SEL

     和 

    IMP

     的差別
  8. autoreleasepool

     的使用場景和原理
  9. RunLoop

     的實作原理和資料結構,什麼時候會用到
  10. block

     為什麼會有循環引用
  11. 使用 

    GCD

     如何實作這個需求:A、B、C 三個任務并發,完成後執行任務 D。
  12. NSOperation

     和 

    GCD

     的差別
  13. CoreData

     的使用,如何處理多線程問題
  14. 如何設計圖檔緩存?
  15. 有沒有自己設計過網絡控件?

阿裡二面:

  1. 怎麼判斷某個 

    cell

     是否顯示在螢幕上
  2. 程序和線程的差別
  3. TCP

     與 

    UDP

     差別
  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 的本質就是在合适的地方插入 

retain

 和 

release

 等方法,那麼就應該從這個角度出發去思考問題。

顯然分别執行 

retain

 和 

release

 操作是沒有必要的,那麼就可以構造出相應的例子:

<code style="border: 0px; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; font-family: "Microsoft YaHei", 微軟雅黑, "Hiragino Sans GB", STHeiti, "WenQuanYi Micro Hei", SimSun, sans-serif, Lucida, Verdana, serif; line-height: 1.6;">NSString *s1 = @"hello";  
NSString *s2 = s1;  
NSString *s2 = nil;  
</code>
           

由于這種問題我們沒有真正實踐過,是以可以委婉的告訴面試官:“根據我的推理,可能會有……”。

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 大神的總結

轉載于:http://www.techug.com/iOS-bat-interview

 【關于我們】

才淇(微信公衆号:caiqicehua),專注于國内各大網際網路公司社會招聘内推。每天更新最新網際網路名企(包括但不限于今日頭條、網易遊戲、BAT、網易網際網路、小米、京東、樂視、攜程等名企)内推資訊,有技術崗、有産品崗、有營運崗、有設計崗、有互動崗、有銷售崗,更有其他N多相關崗位!更多内推資訊請掃描以下二維碼關注查閱。

【ios開發工程師網際網路名企面試】一個iOS程式員的BAT面試經驗和知識點總結

繼續閱讀