本書(shū)針對(duì)當(dāng)前各大IT企業(yè)面試筆試中的特性與側(cè)重點(diǎn),精心挑選了近3年多家典型IT企業(yè)的iOS面試筆試真題,由于這些企業(yè)涉及業(yè)務(wù)包括系統(tǒng)軟件、搜索引擎、電子商務(wù)、手機(jī)軟件、安全關(guān)鍵軟件等領(lǐng)域,所以面試筆試真題非常具有代表性與參考性。同時(shí),本書(shū)對(duì)這些題目進(jìn)行了合理的劃分與歸類(lèi),并進(jìn)行了庖丁解牛式的分析與講解,針對(duì)試題中涉及的部分重點(diǎn)、難點(diǎn)問(wèn)題,本書(shū)都做了適當(dāng)?shù)財(cái)U(kuò)展與延伸,力求對(duì)知識(shí)點(diǎn)的講解清晰而不紊亂,全面而不啰唆。不僅如此,本書(shū)除了對(duì)iOS的基礎(chǔ)語(yǔ)言知識(shí)進(jìn)行深度剖析以外,還針對(duì)數(shù)據(jù)庫(kù)、設(shè)計(jì)模式等相關(guān)知識(shí)的面試筆試做了非常詳細(xì)的介紹。讀者學(xué)習(xí)本書(shū)能夠獲取到求職的知識(shí),更有針對(duì)性地進(jìn)行求職準(zhǔn)備,終能夠收獲一份滿意的工作。
在這里,有面試筆試常見(jiàn)技巧的提煉與總結(jié);
在這里,有面試筆試高頻iOS知識(shí)點(diǎn)的整理與剖析;
在這里,有面試筆試歷年iOS真題的解答與拓展。
本書(shū)是我讀研期間開(kāi)始著手起草,到交稿給出版社為止,整整耗時(shí)一年半。在此之前,我一直對(duì)iOS技術(shù)情有獨(dú)鐘,充滿興趣和學(xué)習(xí)熱情。回想過(guò)去四五年的iOS學(xué)習(xí)歷程,很慶幸當(dāng)時(shí)的決心和之后的堅(jiān)持,正是這種決心和堅(jiān)持使我能收獲一項(xiàng)自己最擅長(zhǎng)的技能。
我從大二開(kāi)始接觸iOS開(kāi)發(fā),那時(shí)候iOS 5剛剛發(fā)布,iOS技術(shù)剛火起來(lái),而我已有的技術(shù)積累并不算多,所以學(xué)習(xí)難度非常大。當(dāng)時(shí),能夠熟練開(kāi)發(fā)iOS應(yīng)用的同學(xué)真的是鳳毛麟角,他們很讓人敬佩,而這也更激發(fā)了我想學(xué)會(huì)iOS開(kāi)發(fā)的欲望。為了學(xué)習(xí)iOS基礎(chǔ),我借閱了學(xué)校圖書(shū)館所有關(guān)于Objective-C的書(shū),對(duì)于計(jì)算機(jī)基礎(chǔ)還不扎實(shí)的我去自學(xué)Objective-C真的是很痛苦,各種iOS開(kāi)發(fā)指南和開(kāi)發(fā)案例的書(shū)也讓我很吃力。好在那時(shí)候我做了一個(gè)正確的選擇,用自己剛拿到的獎(jiǎng)學(xué)金和攢下的錢(qián)毅然決然地買(mǎi)了一臺(tái)低配的新款Mac Pro筆記本式計(jì)算機(jī)(就是2013年剛出視網(wǎng)膜屏幕且大大瘦身的那款,至今這臺(tái)筆記本式計(jì)算機(jī)仍在我手中服役),這也是我能夠長(zhǎng)期保持學(xué)習(xí)熱情以及后來(lái)深入iOS平臺(tái)開(kāi)發(fā)領(lǐng)域的敲門(mén)磚。
我最開(kāi)始主要是拿別人的簡(jiǎn)單DEMO來(lái)學(xué)習(xí),在別人寫(xiě)好的代碼上改改、調(diào)調(diào),我覺(jué)得這是入門(mén)最快的方法。在基本入門(mén)以后,我便開(kāi)始系統(tǒng)地去看書(shū)、去驗(yàn)證,去實(shí)現(xiàn)自己的小想法,去嘗試做一個(gè)小項(xiàng)目等。此外每當(dāng)遇到問(wèn)題,我都會(huì)去開(kāi)發(fā)論壇交流,當(dāng)時(shí)經(jīng)常逛的網(wǎng)站有Cocoa China、Stack Overflow和GitHub等,在此過(guò)程中慢慢積累、慢慢武裝自己。學(xué)習(xí)iOS的周期還是很漫長(zhǎng)的,入門(mén)以后很長(zhǎng)一段時(shí)間我并沒(méi)有太大的提高,直到后來(lái)加入實(shí)際項(xiàng)目、參加公司實(shí)習(xí)以及能夠研究一些優(yōu)秀的開(kāi)源代碼之后,我才踏入進(jìn)階之路,同時(shí)也伴隨著自己計(jì)算機(jī)專(zhuān)業(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)域的路線。條條河流最終都是要匯入大海的,無(wú)論是一開(kāi)始選擇iOS開(kāi)發(fā)、安卓開(kāi)發(fā),還是選擇Web開(kāi)發(fā)等路線,其最終目標(biāo)都應(yīng)該是借此打一口深深的井,鉆下去然后慢慢擴(kuò)散滲透,成為一名優(yōu)秀的計(jì)算機(jī)行業(yè)專(zhuān)家,而不僅僅是一個(gè)初級(jí)平臺(tái)開(kāi)發(fā)者而已。
在編寫(xiě)整理本書(shū)期間,我從頭到尾系統(tǒng)地梳理了自己的知識(shí)體系,不斷地去驗(yàn)證、去挖掘重點(diǎn)、去剖析學(xué)習(xí)中最容易忽視的知識(shí)點(diǎn),揭開(kāi)我們學(xué)習(xí)中常常不愿意揭開(kāi)的傷疤,然后認(rèn)真地做出解析、敷上藥膏。希望本書(shū)能夠幫助更多的讀者壓縮這個(gè)學(xué)習(xí)過(guò)程的成本和周期,更快速地進(jìn)入到更高的技術(shù)層面,更順利地適應(yīng)工作崗位,成為優(yōu)秀的行業(yè)開(kāi)發(fā)者。畢業(yè)后,我進(jìn)入游戲行業(yè),仍一直堅(jiān)持iOS的使用和學(xué)習(xí),這個(gè)長(zhǎng)板對(duì)我尤其重要,是我平時(shí)想法和技術(shù)實(shí)踐的主要移動(dòng)平臺(tái)。
本書(shū)技術(shù)部分將精選收錄的題目進(jìn)行了分類(lèi)。第1章收錄了iOS開(kāi)發(fā)中的一些基礎(chǔ)概念相關(guān)的問(wèn)題;第2章和第3章分別歸類(lèi)了Objective-C語(yǔ)言從基礎(chǔ)知識(shí)到中高級(jí)特性的問(wèn)題,由淺入深地剖析了Objective-C語(yǔ)言開(kāi)發(fā)各方面的核心問(wèn)題;第4章收錄的主要是有關(guān)官方Cocoa Touch框架的常見(jiàn)問(wèn)題;第5章將iOS開(kāi)發(fā)中的對(duì)象間通信機(jī)制相關(guān)的問(wèn)題集中在一起,進(jìn)行了總結(jié)和分析;第6章討論了iOS中的一個(gè)重要話題:圖層與動(dòng)畫(huà),并結(jié)合問(wèn)題進(jìn)行了知識(shí)的總結(jié)和延伸;第7章總結(jié)了數(shù)據(jù)持久化有關(guān)的問(wèn)題;第8章和第9章包含了iOS開(kāi)發(fā)進(jìn)階之路的重中之重:內(nèi)存管理和網(wǎng)絡(luò)多線程編程;第10章收錄了一些其他的重要的零碎話題,包括函數(shù)響應(yīng)式編程、設(shè)計(jì)模式、第三方框架和程序調(diào)試問(wèn)題等;第11章介紹了數(shù)據(jù)庫(kù)相關(guān)知識(shí);第12章介紹了操作系統(tǒng)相關(guān)知識(shí)。
對(duì)于書(shū)中的任何問(wèn)題或困惑,讀者都可以通過(guò)郵件聯(lián)系我:yuancoder@foxmail.com。期待你的來(lái)信。
編 者
2018年5月
前言
面試筆試經(jīng)驗(yàn)技巧篇
經(jīng)驗(yàn)技巧1 如何巧妙地回答面試官的問(wèn)題2
經(jīng)驗(yàn)技巧2 如何回答技術(shù)性問(wèn)題3
經(jīng)驗(yàn)技巧3 如何回答非技術(shù)性問(wèn)題5
經(jīng)驗(yàn)技巧4 如何回答快速估算類(lèi)問(wèn)題5
經(jīng)驗(yàn)技巧5 如何回答算法設(shè)計(jì)問(wèn)題6
經(jīng)驗(yàn)技巧6 如何回答系統(tǒng)設(shè)計(jì)題9
經(jīng)驗(yàn)技巧7 如何解決求職中的時(shí)間沖突問(wèn)題11
經(jīng)驗(yàn)技巧8 如果面試問(wèn)題曾經(jīng)遇見(jiàn)過(guò),是否要告知面試官12
經(jīng)驗(yàn)技巧9 被企業(yè)拒絕后是否可以再申請(qǐng)12
經(jīng)驗(yàn)技巧10 如何應(yīng)對(duì)自己不會(huì)回答的問(wèn)題13
經(jīng)驗(yàn)技巧11 如何應(yīng)對(duì)面試官的激將法語(yǔ)言13
經(jīng)驗(yàn)技巧12 如何處理與面試官持不同觀點(diǎn)這個(gè)問(wèn)題14
經(jīng)驗(yàn)技巧13 什么是職場(chǎng)暗語(yǔ)15
經(jīng)驗(yàn)技巧14 名企iOS工程師行業(yè)訪談錄18
經(jīng)驗(yàn)技巧15 iOS開(kāi)發(fā)的前景如何20
經(jīng)驗(yàn)技巧16 如何選擇iOS開(kāi)發(fā)語(yǔ)言20
經(jīng)驗(yàn)技巧17 React Native 和Weex重要嗎21
經(jīng)驗(yàn)技巧18 企業(yè)對(duì)iOS開(kāi)發(fā)者的要求有哪些22
經(jīng)驗(yàn)技巧19 iOS開(kāi)發(fā)招聘有哪些要求24
經(jīng)驗(yàn)技巧20 iOS技術(shù)崗位面試精選27
面試筆試技術(shù)攻克篇
第1章 iOS開(kāi)發(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 類(lèi)工廠方法是什么40
1.1.7 App ID和Bundle ID有什么不同40
1.1.8 什么是糖衣語(yǔ)法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語(yǔ)言基礎(chǔ)47
2.1 Objective-C語(yǔ)言基礎(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中的類(lèi)方法和實(shí)例方法有什么本質(zhì)區(qū)別和聯(lián)系53
2.1.5 子類(lèi)初始化時(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ì)有什么問(wèn)題55
2.1.10 Objective-C中的可變和不可變類(lèi)型是什么56
2.2 數(shù)據(jù)類(lèi)型57
2.2.1 在Objective-C中,常量有哪幾種類(lèi)型57
2.2.2 Objective-C中數(shù)據(jù)類(lèi)型的限定詞有哪些58
2.2.3 Objective-C中的NSInteger類(lèi)型和C語(yǔ)言中的int類(lèi)型有什么區(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語(yǔ)言的高級(jí)特性63
3.1 Objective-C中的屬性63
3.2 Objective-C語(yǔ)言的多態(tài)性72
3.2.1 什么叫多態(tài)72
3.2.2 重載、重寫(xiě)和隱藏的區(qū)別是什么74
3.2.3 Objective-C和Swift中有重載嗎74
3.3 Objective-C語(yǔ)言的動(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í)語(yǔ)言是什么意思79
3.3.3 Objective-C中的id類(lèi)型指的是什么?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中類(lèi)與對(duì)象如何表示84
3.3.8 如何打印一個(gè)類(lèi)中所有的實(shí)例變量85
3.3.9 如何使用runtime動(dòng)態(tài)添加一個(gè)類(lèi)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中的類(lèi)別與擴(kuò)展機(jī)制96
3.4.1 類(lèi)別與其他特性(類(lèi)擴(kuò)展和繼承)有什么區(qū)別97
3.4.2 Objective-C中類(lèi)別特性的作用及其局限性是什么97
3.4.3 類(lèi)別和類(lèi)擴(kuò)展如何使用98
3.4.4 為什么類(lèi)別只能添加擴(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 其他問(wèn)題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)存布局(考慮有父類(lè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