随着各大公司春招的開始,很多小夥伴都行動起來了,我有幸能夠加入百度并和大家分享自己的經驗心得。由于我面試的都是比較大的公司,是以自然也是做 了這方面的準備,是以這篇總結并不一定适合想去創業公司的同學。另外,由于經驗本來就是主觀性極強的東西,加之筆者水準有限,是以如果有不認可的地方,萬 望諸君呵呵一笑,抛之腦後。
接下來,我就鬥膽分享一下自己在準備和參加面試的過程中的收獲、對面試的思考,以及一些可能對大家有用的建議。最後附贈一份大禮包,希望能幫助每位讀者找到自己心儀的工作。
作為 iOS 開發者,雖然 Swift 已經釋出了快兩年,但是大公司轉向 Swift 的動作還不明顯,是以 Objective-C 幾乎是必備項,Swift 都不一定能算是加分項。iOS 方面的知識也必不可少,雖然招聘資訊上寫着如果基礎紮實,零 iOS 基礎也可以,但是現實往往是比較殘酷的。
我的面試經曆
扯了這麼多,終于進入正題了,分享一下我的面試經曆。題目如下, 破折線後面是簡單的解決思路 。
百度
一面:約 1.5 小時
首先是四個算法題:
- 不用臨時變量怎麼實作 swap(a, b)——用加法或者異或都可以
- 二維有序數組查找數字——劍指 offer 第 3題
- 億級日志中,查找登陸次數最多的十個使用者——(不确定對不對,我的思路是)先用哈希表儲存登陸次數和ID,然後用紅黑樹儲存最大的十個數。劍指 offer 第 30題
- 簡述排序算法——快排,
函數的原理,堆排(不穩定),歸并排序,基數排序。partion
然後有一個 智力題 ,沒完整的答出來,好像影響不是很大。
最後是 iOS 相關,面試官問的很開放,都是談談自己的了解:
- 說說你對 OC 中
方法和load
方法的異同。——主要說一下執行時間,各自用途,沒實作子類的方法會不會調用父類的?initialize
- 說說你對 block 的了解。—— 三種 block,棧上的自動複制到堆上,block 的屬性修飾符是 copy,循環引用的原理和解決方案。
- 說說你對 runtime 的了解。——主要是方法調用時如何查找緩存,如何找到方法,找不到方法時怎麼轉發,對象的記憶體布局。
- 說說你對 MVC 和 MVVM 的了解。—— MVC 的 C 太臃腫,可以和 V 合并,變成 MVVM 中的 V,而 VM 用來将 M 轉化成 V 能用的資料。
- 說說 UITableView 的調優。——一方面是通過 instruments 檢查影響性能的地方,另一方面是估算高度并在 runloop 空閑時緩存。
- 談談你對 ARC 的了解。ARC 是編譯器完成的,依靠引用計數,談談幾個屬性修飾符的記憶體管理政策,什麼情況下會記憶體洩露。
一面的問題非常基礎,主要是算法和 Objective-C,因為準備比較充分,基本上答出來 80% 吧。大約一周後突然二面。
二面:約 0.5 小時
二面比較突然,顯示簡單的自我介紹,然後問了三個問題:
- 野指針是什麼,iOS 開發中什麼情況下會有野指針?——野指針是不為 nil,但是指向已經被釋放的記憶體的指針,不知道什麼時候會有,如果有知道的讀者還望提醒。
- 介紹 block。—— (接第一問) 我讓面試官提示我一下什麼時候會有野指針,他說用 block 時,我表示還是不知道,隻知道 block 會有循環引用。于是就扯回了一面的問題。
- 說說你是怎麼優化 UITableView 的。——還是一面的問題。。。。。。。。。。。
雖然通過了,但是幾乎又問了一遍一面的問題讓我感覺對方不太認真。
三面:北京 onsite,約 2.5 小時
首先是給一個小時,手寫算法:
- 給一個字元串,如何判斷它是否是合法的 IP 位址,比如 “192.168.1.1” 就是合法的。
- 說說大數相加的思路,動手寫代碼實作。
沒能寫完,主要是大數相加的時候需要考慮負數,耽擱了一點時間。
然後讓我簡述 TCP 建立和關閉連接配接時,握手的過程。還問了前者為什麼是三次,後者需要四次?
接下來是設計了一個實際場景,為了簡化問題,我們考慮這個問題:假設有 10W 條電話号碼,如何通過輸入電話号碼的某一段内容,快速搜尋出來。比如輸入
234
,以下兩個号碼都會顯示在搜尋結果中:
- 123456789000
- 188888823400
其實最簡單的解決方案是周遊所有字元串,然後用 KMP 算法。但是這樣的問題是需要周遊 10W 個元素,效率比較低。我想到的是辦法是使用索引。建立 100 個索引(00 到 99),比如輸入
234
時隻需要在索引
23
對應的區域查找即可,可以加快 100 倍速度。但是缺點是插入資料時,需要更新多個索引,資料量會是原來的 10 倍。
目前還沒有想到好的解決方案。有大神提醒說用字典樹,有空研究一番。
最後問了 OC 的數組中,添加
nil
對象會有什麼問題。當時沒答上來,現在想想很不應該,因為數組是以
nil
結尾的,如果添加了
nil
,後續就不能添加對象了。
網易
筆試
主要是計算機方面的大雜燴,涉及作業系統,網絡,移動開發,算法等。難度不大,目測是為了淘汰渾水摸魚的人,就不列出題目了,算法有三題,直接線上寫(木有 IDE 表示很憂傷):
- 很長一道題,讀了很久才讀懂,目測是 DFS,但是最後沒時間了,寫了個思路。
- 把 “www.zhidao.baidu.com” 這樣的字元串改成 “com/baidu/zhidao/www”。——老題目了,劍指 offer 的,兩次逆序排列即可。
- 求數組中和為某個值的所有子數組,比如數組是
一共有四個子數組的和是 15,比如[5,5,10,2,3]
,[5,10]
,[5,10]
,[10,2,3]
。這個就是簡單的遞歸了,分兩種情況,目前位置的數字在子數組中,以及不在子數組中。[5,5,2,3]
一面
全部是 iOS 題,可能是覺得算法已經面過了:
- 介紹 block。——我提到棧上的 block 在 ARC 下會自動複制到堆上,面試官問我從 iOS 4 還是 5 開始支援這一特性,表示不知道,我又不是學 OC 曆史的,後來想想可能是公司内部老項目有這個坑。
- ARC 會對代碼做什麼優化?——比如
這樣的語句,可能就不會有NSString *s2 = s1; s2 = nil
和retain
方法了。release
- 介紹一下 MVVM 和 RAC。——可能是我履歷的某個角落寫了用過 RAC,被挖出來了,大概談了一下,結果面試官問我資料的雙向綁定怎麼做,
函數了解過麼,果斷說已經忘了:joy::joy::joy:bind
- 介紹自己用過哪些開源庫。——Masonry 和 SnapKit,AFNetWorking,MKNetworkKit,Alamofire,Mantle,SDWebImage
- 如果讓你寫,你能實作麼?——當然不能,不然還要實習?
- 讀過某個庫的源碼麼?——扯了一點 SDWebImage,後來被告知這個庫用了 runloop 來保證滑動是加載資料的流暢性,自己看了源碼後表示沒有發現,唯一用到 runloop 地方是保證背景線程一直跑,也有可能是我了解錯了,如果錯誤歡迎指正。
- SDWebImage 下載下傳了圖檔後為什麼要解碼?——當時蒙住了,面試官很 nice 的解釋了一下,說是要把 png 檔案建立一個什麼記憶體映射,目前還不太懂,有空研究一下。
本來以為面的這麼差肯定是挂了,沒想到還是過了一面。過了不到一個小時,HR 電話打過來,約了兩天後二面。
二面
純數學和算法:
- 下面這段代碼的輸出結果是:
答案是 2 和 5。c int main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf(“%d,%d”,*(a+1),*(ptr-1)); }
是指向數組開頭元素的指針,a
就是指向下一個元素的指針,是以星号求值以後是 2。a + 1
相當于是數組的指針,&a
是數組後面一個數組的指針,然後轉換成&a + 1
類型是 5 這個數字後面的一個數字的指針。再減一就是指向 5 的指針,是以星号求值以後是 5。int *
- 某個地方天氣有如下規律:如果第一天和第二天都不下雨,則第三天下雨的機率為30%;如果第一天和第二天中有任 意一天下雨,則第三天下雨的機率為60%。問如果周一周二都沒下雨,那麼周四下雨的機率為 _ 。簡單的機率題,答案是:
30% * 60% + 70% * 30% = 39%
- 某癡迷撲克的小團體喜歡用23456789TJQKA來計數,A後面是22,23,…,2A,32,…,AA,222,… 依次類推。請用C/C++或Java寫個程式,将用字元串表示這種計數法轉換成字元串表示的10進制整數。其中,該計數法的2就對應于十進制的2,之後依 次遞增。C/C++函數接口: char* pokToDec(char *)我的解決思路是進制轉換,類似于 16 進制轉換 10 進制這種,最後再把數字轉成
類型。char *
然後好像沒結果了,可能是程式設計實作太渣了?
其他我知道的面試題
阿裡一面:
-
具有什麼樣的優勢,各個子產品之間怎麼通信,比如點選 Button 後 怎麼通知 Model?MVC
- 兩個無限長度連結清單(也就是可能有環) 判斷有沒有交點
-
的相關優化UITableView
-
、KVO
、Notification
各自的優缺點,效率還有使用場景delegate
- 如何手動通知
KVO
- Objective-C 中的
方法copy
- runtime 中,
和SEL
的差別IMP
-
的使用場景和原理autoreleasepool
-
的實作原理和資料結構,什麼時候會用到RunLoop
-
為什麼會有循環引用block
- 使用
如何實作這個需求:A、B、C 三個任務并發,完成後執行任務 D。GCD
-
和NSOperation
的差別GCD
-
的使用,如何處理多線程問題CoreData
- 如何設計圖檔緩存?
- 有沒有自己設計過網絡控件?
阿裡二面:
- 怎麼判斷某個
是否顯示在螢幕上cell
- 程序和線程的差別
-
與TCP
差別UDP
-
流量控制TCP
- 數組和連結清單的差別
-
生命周期UIView
- 如果頁面 A 跳轉到 頁面 B,A 的
方法和 B 的viewDidDisappear
方法哪個先調用?viewDidAppear
-
循環引用問題block
-
的本質ARC
-
的基本概念,它是怎麼休眠的?RunLoop
-
什麼時候釋放,在什麼場景下使用?Autoreleasepool
- 如何找到字元串中第一個不重複的字元
- 哈希表如何處理沖突
面試收獲
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 開發者,相信前三部分的資料也或多或少能夠幫上你。
算法
這一部分的内容主要分為以下幾個部分:字元串、數組與查找、連結清單、樹以及其他基礎問題。
總的來說,算法問題可以分為以下三類:
- 基礎問題:即使是新手,一眼看過去就有思路,隻是實作的時候需要注意細節。
- 普通問題:這些問題通常屬于以上分類中的某一類,需要面試者掌握一些常見的思路,比如遞歸、動态規劃、BFS/DFS、雙指針、二分搜尋 等。或者是直接考察資料結構的使用,如:哈希、棧和隊列、連結清單等,如果具備了這些基礎知識,此類題目通常能夠比較快速的解決。
- 進階問題:這些題的解題思路和普通問題相似,但是需要你事先有對應的知識積累,否則難以直接看出問題的本質。
- 疑難雜題:這類問題比較奇怪,解決它以後并不能給别的題目太多幫助,如果時間緊張可以暫時放棄。
一般來說,一類問題難度不大,面試前簡單複習一下,面試時小心仔細,全面思考即可。二三類問題是面試重點,需要提前準備。第四類問題通常出現較少,即使不會做,對最終評價的負面影響也不會有前三類那麼大。
如果時間充裕,我建議閱讀 《劍指 Offer》 這本書并配合 Leetcode 來鞏固知識,在我的面試過程中,出現很多書上的原題或者變體,我自認為沒有因為算法而影響任何一次面試的成績。如果時間緊張,你也可以隻完成我列出的一些經典題目,在“【】”中标記了我對此題類型的分類, 如果加星号表示此題在實際面試中出現過 。
PS: 最近有小夥伴被問到了哈希表的實作。這可以了解為算法,也可以歸類為計算機基礎知識。總的來說你至少需要明白哈希值的特點和兩種解決沖突的方式:拉鍊式和開放尋址。
字元串
- 【3】最長回文子串
- 【3】最長無重複子串
- 【1*】字元串轉數字
- 【4】KMP 算法
- 【2】字元串全排列
- 【2*】翻轉字元串
動态規劃
- 【2】背包問題
- 【3】連續子數組的最大和
- 【4】實作簡單的正規表達式比對
數組
- 【3】求兩個等長、有序數組的中位數(二分法)
- 【4】求兩個不等長、有序數組的中位數
- 【3】旋轉數組求最小值 、 【3】旋轉數組求查找某個值是否存在 (二分法)
- 【4*】每行從左到右,每列從上到下遞增的二維數組中,判斷某個數是否存在(劍指 offer 第 3 題)
- 【3*】數組中出現次數超過一半的數字
- 【3*】第 k 大的數 (拓展:最大的 k 個數)
- 【3*】有序數組中某個數字出現的次數(提示:利用二分搜尋)
連結清單
- 【2】反轉連結清單 (使用遞歸和疊代兩種解法,了解頭插法)
- 【3】删除連結清單的目前節點
- 【3】删除倒數第 k 個節點
- 【1】兩個有序連結清單合并
- 【4】複雜連結清單的複制
- 【2*】判斷連結清單是否有環
- 【3*】兩個連結清單的第一個公共節點 (提示:考慮連結清單有環的情況)
- 【3】删除連結清單中重複節點
樹
- 【3】根據中序和後序周遊結果重建二叉樹 、 【3】根據中序和前序周遊結果重建二叉樹
- 【2】翻轉二叉樹
- 【2】從上往下列印二叉樹 (BFS 的思想)
- 【3】判斷某個數組是不是二叉樹的後序周遊結果 (劍指 offer 第 24 題)
- 【3】二叉樹中和為某個值的路徑
- 【3*】二叉樹中某個節點的下一個節點 (強烈推薦準備一下,劍指 offer 第 58 題)
棧
- 【2】用兩個棧實作隊列 、 【2】用兩個隊列實作棧
- 【2】實作一個棧,可以用常數級時間找出棧中的最小值
- 【3】判斷棧的壓棧、彈棧序列是否合法(劍指offer 第 22 題)
排序
了解以下排序的時間、空間複雜度,是否穩定,實作原理
- 歸并排序 、拓展:求數組中的逆序對個數
- 快速排序 重點:
函數的實作partion
- 堆排序
- 數組元素值域已知時,考慮 基數排序 和 桶排序
位運算
- 【2】給一個十進制數字,求它的二進制表示中,有多少個 1 (n &= n – 1)
- 【3】給一個數組,所有數字都出現了偶數次,隻有一個出現了一次,找出這個數
- 【4】給一個數組,所有數字都出現了三次,隻有一個出現了一次,找出這個數
- 【3】給一個數組,所有數組都出現了偶數次,隻有兩個數字出現了一次,找出這兩個數
網絡層
根據不同的面試崗位,側重點略有不同。對 iOS 和 Android 開發者來說,HTTP 考的略少,以 TCP 和 UDP 為主。其實 UDP 基本上隻會考察和 TCP 的差別。
當然還有一些常見的基礎問題,比如 Cookie 和 Session 的考察,POST 和 GET 的考察,HTTPS 的簡單了解等。這些問題在我的部落格中都有簡單的總結。
總結了一些資料,數字序号越大的資料表示篇幅更長,耗時更久,難度更大,講解更細緻。破折線後表示預計需要多久可以讀完。
- 【部落格】我的六篇總結 ————不到一周
- 【書】圖解 TCP/IP ————半個月
- 【書】TCP/IP 詳解 ————沒讀過,感覺至少需要一個月
- 【書】TCP/IP 協定簇 ————沒讀過,感覺至少需要一個月
光讀書是沒有用的,一問到實際問題很容易懵逼,以下是我總結的一些問題:
- 簡介 TCP 和 UDP 差別,他們位于哪一層?
- 路由器和交換機的工作原理大概是什麼,他們分别用到什麼協定,位于哪一層?
- 描述TCP 協定三次握手,四次釋放的過程。
- TCP 協定是如何進行流量控制,擁塞控制的?
- 為什麼建立連接配接時是三次握手,兩次行不行?如果第三次握手失敗了怎麼處理
- 關閉連接配接時,第四次握手失敗怎麼處理?
- 你怎麼了解分層和協定?
- HTTP 請求中的GET 和 POST 的差別,Session 和 Cookie 的差別。
- 談談你對 HTTP 1.1,2.0 和 HTTPS 的了解。
作業系統與編譯
我被問到的作業系統問題很少,是以僅僅總結了一些自認為比較重要的問題。關于這一部分的知識,推薦閱讀 《程式員的自我修養》 ,如果時間有限,你可以閱讀我的 《程式員的自我修養讀書筆記》 ,并思考這些問題:
- 源代碼是怎麼變成可執行檔案的,每一步的作用是什麼?(預編譯,詞法分析,文法分析,語義分析,中間語言生成目标代碼生成,彙編,連結)
- 應用層、API、運作庫、系統調用、作業系統核心之間的關系是什麼?
- 虛拟記憶體空間是什麼,為什麼要有虛拟記憶體空間。
- 靜态連結和動态連結分别表示什麼,大概是怎麼實作的?
- 可執行檔案的結構如何?(分為哪些段)
- 它是怎麼裝載進記憶體的,為什麼要分段,分頁,頁錯誤是什麼?
- 程序的記憶體格局是怎樣的?(堆、棧、全局/靜态區,代碼區,常量區)
- 堆和棧的差別,函數調用和棧的關系
- 程序和線程的差別
- 異步和同步,串行,并發,并行的差別
- 多并發任務,僅多線程能加快速度麼(不能,會變慢,有線程切換的開銷)
- 多個線程之間可以共享那些資料
- 程序之間如何通信
- 介紹幾種鎖,他們的用途和差別
關于多線程相關的,推薦閱讀這篇文章的前面一小部分—— 《 iOS多線程程式設計——GCD與NSOperation總結 》
關于作業系統和編譯方面的文章,除了讀原書和我的讀書筆記外,還可以參考這篇文章—— 《 修改一個數字破解Mac上的應用 》
OC
首先兩本必備的神書一定是要讀完的。一本是講 OC 的《Effective Objective-C 2.0》,中文名叫:“編寫高品質 iOS 與 OS X 代碼的 52 個有效方法”。另一本書叫:《Objective-C 進階程式設計》。前者講解 OC 中各種細節,後者主要講了 ARC、Block 和 GCD。
光是讀書,思考不夠,很容易在面試時被問懵逼,是以建議一遍嘗試回答面試真題,一邊閱讀以下總結性的文章,重要性不分先後:
- 檢測記憶體洩露
- KVO與KVC原理 、 KVO、Notification、Delegate優缺點 、 最推薦的官方文檔
- GCD 與 NSOperation
- Runtime
- block
- atomic 線程安全 、 @synchronized
- 對象的深淺複制
- 招聘一個靠譜的iOS
- 消息傳遞機制
- 深入了解Objective-C:Category
強烈推薦第八篇文章,做完這上面的題目基本上可以應付大多數 OC 方面的問題了。
iOS 開發
- RunLoop
- Cell 圖檔異步加載優化
- iOS 函數式程式設計的實作 && 響應式程式設計概念
- 記憶體惡鬼drawRect
- UIKit 性能調優(主要是UITableView)
- 優化UITableViewCell高度計算的那些事
- 高性能圖檔架構與設計
- 輕量化視圖控制器
- UIView的生命周期
- 高效設定圓角
- 事件的傳遞和響應機制
- ReactiveCocoa 和 MVVM 入門
其中需要重點了解
runloop
,它不僅僅是簡單的“跑圈”的 概念,很多問題其實都與它有關,建議認真閱讀 ibireme 大神的總結
轉載于:http://www.techug.com/iOS-bat-interview
【關于我們】
才淇(微信公衆号:caiqicehua),專注于國内各大網際網路公司社會招聘内推。每天更新最新網際網路名企(包括但不限于今日頭條、網易遊戲、BAT、網易網際網路、小米、京東、樂視、攜程等名企)内推資訊,有技術崗、有産品崗、有營運崗、有設計崗、有互動崗、有銷售崗,更有其他N多相關崗位!更多内推資訊請掃描以下二維碼關注查閱。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNx8FesU2cfdGLwczX0xiRGZkRGZ0Xy9GbvNGL38VZ6l2cs0TPRlVModlWqx2VjBnRykVQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1EDN1ADN0cTM4IDOwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)