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