本書針對(duì)當(dāng)前各大IT企業(yè)面試筆試中的特性與側(cè)重點(diǎn),精心挑選了近3年多家典型IT企業(yè)的iOS面試筆試真題,由于這些企業(yè)涉及業(yè)務(wù)包括系統(tǒng)軟件、搜索引擎、電子商務(wù)、手機(jī)軟件、安全關(guān)鍵軟件等領(lǐng)域,所以面試筆試真題非常具有代表性與參考性。同時(shí),本書對(duì)這些題目進(jìn)行了合理的劃分與歸類,并進(jìn)行了庖丁解牛式的分析與講解,針對(duì)試題中涉及的部分重點(diǎn)、難點(diǎn)問題,本書都做了適當(dāng)?shù)財(cái)U(kuò)展與延伸,力求對(duì)知識(shí)點(diǎn)的講解清晰而不紊亂,全面而不啰唆。不僅如此,本書除了對(duì)iOS的基礎(chǔ)語言知識(shí)進(jìn)行深度剖析以外,還針對(duì)數(shù)據(jù)庫(kù)、設(shè)計(jì)模式等相關(guān)知識(shí)的面試筆試做了非常詳細(xì)的介紹。讀者學(xué)習(xí)本書能夠獲取到求職的知識(shí),更有針對(duì)性地進(jìn)行求職準(zhǔn)備,終能夠收獲一份滿意的工作。
在這里,有面試筆試常見技巧的提煉與總結(jié);
在這里,有面試筆試高頻iOS知識(shí)點(diǎn)的整理與剖析;
在這里,有面試筆試歷年iOS真題的解答與拓展。
本書是我讀研期間開始著手起草,到交稿給出版社為止,整整耗時(shí)一年半。在此之前,我一直對(duì)iOS技術(shù)情有獨(dú)鐘,充滿興趣和學(xué)習(xí)熱情;叵脒^去四五年的iOS學(xué)習(xí)歷程,很慶幸當(dāng)時(shí)的決心和之后的堅(jiān)持,正是這種決心和堅(jiān)持使我能收獲一項(xiàng)自己最擅長(zhǎng)的技能。
我從大二開始接觸iOS開發(fā),那時(shí)候iOS 5剛剛發(fā)布,iOS技術(shù)剛火起來,而我已有的技術(shù)積累并不算多,所以學(xué)習(xí)難度非常大。當(dāng)時(shí),能夠熟練開發(fā)iOS應(yīng)用的同學(xué)真的是鳳毛麟角,他們很讓人敬佩,而這也更激發(fā)了我想學(xué)會(huì)iOS開發(fā)的欲望。為了學(xué)習(xí)iOS基礎(chǔ),我借閱了學(xué)校圖書館所有關(guān)于Objective-C的書,對(duì)于計(jì)算機(jī)基礎(chǔ)還不扎實(shí)的我去自學(xué)Objective-C真的是很痛苦,各種iOS開發(fā)指南和開發(fā)案例的書也讓我很吃力。好在那時(shí)候我做了一個(gè)正確的選擇,用自己剛拿到的獎(jiǎng)學(xué)金和攢下的錢毅然決然地買了一臺(tái)低配的新款Mac Pro筆記本式計(jì)算機(jī)(就是2013年剛出視網(wǎng)膜屏幕且大大瘦身的那款,至今這臺(tái)筆記本式計(jì)算機(jī)仍在我手中服役),這也是我能夠長(zhǎng)期保持學(xué)習(xí)熱情以及后來深入iOS平臺(tái)開發(fā)領(lǐng)域的敲門磚。
我最開始主要是拿別人的簡(jiǎn)單DEMO來學(xué)習(xí),在別人寫好的代碼上改改、調(diào)調(diào),我覺得這是入門最快的方法。在基本入門以后,我便開始系統(tǒng)地去看書、去驗(yàn)證,去實(shí)現(xiàn)自己的小想法,去嘗試做一個(gè)小項(xiàng)目等。此外每當(dāng)遇到問題,我都會(huì)去開發(fā)論壇交流,當(dāng)時(shí)經(jīng)常逛的網(wǎng)站有Cocoa China、Stack Overflow和GitHub等,在此過程中慢慢積累、慢慢武裝自己。學(xué)習(xí)iOS的周期還是很漫長(zhǎng)的,入門以后很長(zhǎng)一段時(shí)間我并沒有太大的提高,直到后來加入實(shí)際項(xiàng)目、參加公司實(shí)習(xí)以及能夠研究一些優(yōu)秀的開源代碼之后,我才踏入進(jìn)階之路,同時(shí)也伴隨著自己計(jì)算機(jī)專業(yè)水平的同步提高。事實(shí)上,我本科期間學(xué)習(xí)的匯編、編譯原理、計(jì)算機(jī)組成原理、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫(kù)原理等,都一直在起著潛移默化的作用,而iOS技術(shù)的學(xué)習(xí),則像是一個(gè)實(shí)踐的平臺(tái),一個(gè)深入行業(yè)領(lǐng)域的路線。條條河流最終都是要匯入大海的,無論是一開始選擇iOS開發(fā)、安卓開發(fā),還是選擇Web開發(fā)等路線,其最終目標(biāo)都應(yīng)該是借此打一口深深的井,鉆下去然后慢慢擴(kuò)散滲透,成為一名優(yōu)秀的計(jì)算機(jī)行業(yè)專家,而不僅僅是一個(gè)初級(jí)平臺(tái)開發(fā)者而已。
在編寫整理本書期間,我從頭到尾系統(tǒng)地梳理了自己的知識(shí)體系,不斷地去驗(yàn)證、去挖掘重點(diǎn)、去剖析學(xué)習(xí)中最容易忽視的知識(shí)點(diǎn),揭開我們學(xué)習(xí)中常常不愿意揭開的傷疤,然后認(rèn)真地做出解析、敷上藥膏。希望本書能夠幫助更多的讀者壓縮這個(gè)學(xué)習(xí)過程的成本和周期,更快速地進(jìn)入到更高的技術(shù)層面,更順利地適應(yīng)工作崗位,成為優(yōu)秀的行業(yè)開發(fā)者。畢業(yè)后,我進(jìn)入游戲行業(yè),仍一直堅(jiān)持iOS的使用和學(xué)習(xí),這個(gè)長(zhǎng)板對(duì)我尤其重要,是我平時(shí)想法和技術(shù)實(shí)踐的主要移動(dòng)平臺(tái)。
本書技術(shù)部分將精選收錄的題目進(jìn)行了分類。第1章收錄了iOS開發(fā)中的一些基礎(chǔ)概念相關(guān)的問題;第2章和第3章分別歸類了Objective-C語言從基礎(chǔ)知識(shí)到中高級(jí)特性的問題,由淺入深地剖析了Objective-C語言開發(fā)各方面的核心問題;第4章收錄的主要是有關(guān)官方Cocoa Touch框架的常見問題;第5章將iOS開發(fā)中的對(duì)象間通信機(jī)制相關(guān)的問題集中在一起,進(jìn)行了總結(jié)和分析;第6章討論了iOS中的一個(gè)重要話題:圖層與動(dòng)畫,并結(jié)合問題進(jìn)行了知識(shí)的總結(jié)和延伸;第7章總結(jié)了數(shù)據(jù)持久化有關(guān)的問題;第8章和第9章包含了iOS開發(fā)進(jìn)階之路的重中之重:內(nèi)存管理和網(wǎng)絡(luò)多線程編程;第10章收錄了一些其他的重要的零碎話題,包括函數(shù)響應(yīng)式編程、設(shè)計(jì)模式、第三方框架和程序調(diào)試問題等;第11章介紹了數(shù)據(jù)庫(kù)相關(guān)知識(shí);第12章介紹了操作系統(tǒng)相關(guān)知識(shí)。
對(duì)于書中的任何問題或困惑,讀者都可以通過郵件聯(lián)系我:yuancoder@foxmail.com。期待你的來信。
編 者
2018年5月
前言
面試筆試經(jīng)驗(yàn)技巧篇
經(jīng)驗(yàn)技巧1 如何巧妙地回答面試官的問題2
經(jīng)驗(yàn)技巧2 如何回答技術(shù)性問題3
經(jīng)驗(yàn)技巧3 如何回答非技術(shù)性問題5
經(jīng)驗(yàn)技巧4 如何回答快速估算類問題5
經(jīng)驗(yàn)技巧5 如何回答算法設(shè)計(jì)問題6
經(jīng)驗(yàn)技巧6 如何回答系統(tǒng)設(shè)計(jì)題9
經(jīng)驗(yàn)技巧7 如何解決求職中的時(shí)間沖突問題11
經(jīng)驗(yàn)技巧8 如果面試問題曾經(jīng)遇見過,是否要告知面試官12
經(jīng)驗(yàn)技巧9 被企業(yè)拒絕后是否可以再申請(qǐng)12
經(jīng)驗(yàn)技巧10 如何應(yīng)對(duì)自己不會(huì)回答的問題13
經(jīng)驗(yàn)技巧11 如何應(yīng)對(duì)面試官的激將法語言13
經(jīng)驗(yàn)技巧12 如何處理與面試官持不同觀點(diǎn)這個(gè)問題14
經(jīng)驗(yàn)技巧13 什么是職場(chǎng)暗語15
經(jīng)驗(yàn)技巧14 名企iOS工程師行業(yè)訪談錄18
經(jīng)驗(yàn)技巧15 iOS開發(fā)的前景如何20
經(jīng)驗(yàn)技巧16 如何選擇iOS開發(fā)語言20
經(jīng)驗(yàn)技巧17 React Native 和Weex重要嗎21
經(jīng)驗(yàn)技巧18 企業(yè)對(duì)iOS開發(fā)者的要求有哪些22
經(jīng)驗(yàn)技巧19 iOS開發(fā)招聘有哪些要求24
經(jīng)驗(yàn)技巧20 iOS技術(shù)崗位面試精選27
面試筆試技術(shù)攻克篇
第1章 iOS開發(fā)基礎(chǔ)概念35
1.1 概念35
1.1.1 什么是應(yīng)用瘦身35
1.1.2 什么是Cocoa和Cocoa Touch36
1.1.3 什么是謂詞36
1.1.4 什么是響應(yīng)者鏈38
1.1.5 什么是懶加載39
1.1.6 類工廠方法是什么40
1.1.7 App ID和Bundle ID有什么不同40
1.1.8 什么是糖衣語法40
1.2 其他43
1.2.1 什么是SpriteKit和SceneKit43
1.2.2 iOS應(yīng)用的生命周期回調(diào)方法主要有哪些43
1.2.3 iOS應(yīng)用有哪幾種不同狀態(tài)?分別表示什么含義44
1.2.4 UIButton到NSObject之間的繼承關(guān)系是怎樣的45
1.2.5 Git和SVN有什么異同45
第2章 Objective-C語言基礎(chǔ)47
2.1 Objective-C語言基礎(chǔ)特性47
2.1.1 Objective-C的優(yōu)缺點(diǎn)有哪些47
2.1.2 相對(duì)于Objective-C而言,Swift有什么新特性48
2.1.3 Foundation對(duì)象與Core Foundation對(duì)象有什么區(qū)別52
2.1.4 Objective-C中的類方法和實(shí)例方法有什么本質(zhì)區(qū)別和聯(lián)系53
2.1.5 子類初始化時(shí)為什么要調(diào)用self = [super init]54
2.1.6 #import與#include以及#import<>與#import" "各有什么區(qū)別54
2.1.7 Objective-C中@class代表什么54
2.1.8 Objective-C中有二維數(shù)組嗎?如何實(shí)現(xiàn)55
2.1.9 在Objective-C的數(shù)組或字典中,添加nil對(duì)象會(huì)有什么問題55
2.1.10 Objective-C中的可變和不可變類型是什么56
2.2 數(shù)據(jù)類型57
2.2.1 在Objective-C中,常量有哪幾種類型57
2.2.2 Objective-C中數(shù)據(jù)類型的限定詞有哪些58
2.2.3 Objective-C中的NSInteger類型和C語言中的int類型有什么區(qū)別59
2.2.4 NSNumber與NSInteger有什么區(qū)別59
2.3 運(yùn)算符和表達(dá)式60
2.3.1 在Objective-C中,前置運(yùn)算和后置運(yùn)算有什么區(qū)別60
2.3.2 整型值和浮點(diǎn)值在賦值操作中如何相互轉(zhuǎn)換61
第3章 Objective-C語言的高級(jí)特性63
3.1 Objective-C中的屬性63
3.2 Objective-C語言的多態(tài)性72
3.2.1 什么叫多態(tài)72
3.2.2 重載、重寫和隱藏的區(qū)別是什么74
3.2.3 Objective-C和Swift中有重載嗎74
3.3 Objective-C語言的動(dòng)態(tài)性75
3.3.1 什么是編譯時(shí)與運(yùn)行時(shí)79
3.3.2 所謂的Objective-C是動(dòng)態(tài)運(yùn)行時(shí)語言是什么意思79
3.3.3 Objective-C中的id類型指的是什么?id、nil代表什么82
3.3.4 一般的方法method和Objective-C中的選擇器selector有什么區(qū)別83
3.3.5 什么時(shí)候會(huì)報(bào)unrecognized selector錯(cuò)誤83
3.3.6 什么是目標(biāo)-動(dòng)作機(jī)制83
3.3.7 在runtime中類與對(duì)象如何表示84
3.3.8 如何打印一個(gè)類中所有的實(shí)例變量85
3.3.9 如何使用runtime動(dòng)態(tài)添加一個(gè)類87
3.3.10 如何在Category中增加屬性(關(guān)聯(lián)對(duì)象)88
3.3.11 如何理解消息傳遞機(jī)制89
3.3.12 如何理解消息轉(zhuǎn)發(fā)機(jī)制91
3.3.13 isKindOfClass和isMemberOfClass有什么區(qū)別與聯(lián)系94
3.3.14 Objective-C有私有方法嗎?有私有變量嗎94
3.4 Objective-C中的類別與擴(kuò)展機(jī)制96
3.4.1 類別與其他特性(類擴(kuò)展和繼承)有什么區(qū)別97
3.4.2 Objective-C中類別特性的作用及其局限性是什么97
3.4.3 類別和類擴(kuò)展如何使用98
3.4.4 為什么類別只能添加擴(kuò)展方法而不能添加屬性變量101
3.5 Method Swizzling魔法102
3.5.1 Method Swizzling的應(yīng)用場(chǎng)景有哪些102
3.5.2 如何使用runtime進(jìn)行方法交換105
3.6 其他問題107
3.6.1 C和Objective-C如何混用107
3.6.2 Swift和Objective-C如何互調(diào)107
3.6.3 Objective-C對(duì)象可以被copy的條件是什么109
3.6.4 Objective-C等同性中的字符串相等如何判斷110
3.6.5 一個(gè)Objective-C對(duì)象如何進(jìn)行內(nèi)存布局(考慮有父類的情況)111
第4章 Cocoa Touch框架相關(guān)112
4.1 UITableView112
4.1.1 UITableViewCell的復(fù)用原理是怎么樣的112
4.1.2 能否在一個(gè)視圖控制器中嵌入兩個(gè)tableView控制器114
4.1.3 一個(gè)tableView是否可以關(guān)聯(lián)兩個(gè)不同的datasource數(shù)據(jù)源115
4.1.4 如何對(duì)UITableView的滾動(dòng)加載進(jìn)行優(yōu)化,防止卡頓116
4.2 UI視圖117
4.2.1 viewDidLoad和viewDidAppear的區(qū)別是什么117
4.2.2 frame和bounds有什么區(qū)別1