內容簡介
本書針對當前各大 IT 企業面試筆試中的特性與側重點,精心挑選了近 3 年多家頂級 IT 企業的 iOS 面試筆試真題,由於這些企業涉及業務包括系 統軟體、搜尋引擎、電子商務、手機軟體、安全關鍵軟體等領域,所以面 試筆試真題非常具有代表性與參考性。同時,本書對這些題目進行了合理 的劃分與歸類,並進行了庖丁解牛式的分析與講解,針對試題中涉及的部 分重點、難點問題,本書都做了適當地擴展與延伸,力求對知識點的講解 清晰而不紊亂,全面而不囉唆。不僅如此,本書除了對 iOS 的基礎語言知 識進行深度剖析以外,還針對資料庫、設計模式等相關知識的面試筆試做 了非常詳細的介紹。讀者學習本書能夠獲取到求職的知識,更有針對性地 進行求職準備,最終能夠收穫一份滿意的工作。
本書是一本適合計算機相關專業畢業生面試筆試的求職用書,同時也 適合期望在計算機軟、硬體行業大顯身手的計算機愛好者閱讀。本書起於 iOS 面試筆試,但收穫的不止面試筆試,還有更多的 iOS 實用操作技能。 書中附有大量面試筆試真題,讓讀者能夠最大限度地提升應試技能。
作者簡介
蔣信厚,活躍於iOS平台和圖形遊戲領域的程式設計師,碩士畢業於香港大學計算機系,就職於盛大遊戲,計算機技術熱愛者,擅技術總結和分享。
目錄
前言
面試筆試經驗技巧篇
經驗技巧1 如何巧妙地回答面試官的問題2
經驗技巧2 如何回答技術性問題3
經驗技巧3 如何回答非技術性問題5
經驗技巧4 如何回答快速估算類問題5
經驗技巧5 如何回答算法設計問題6
經驗技巧6 如何回答系統設計題9
經驗技巧7 如何解決求職中的時間衝突問題11
經驗技巧8 如果面試問題曾經遇見過,是否要告知面試官12
經驗技巧9 被企業拒絕後是否可以再申請12
經驗技巧10 如何應對自己不會回答的問題13
經驗技巧11 如何應對面試官的“激將法”語言13
經驗技巧12 如何處理與面試官持不同觀點這個問題14
經驗技巧13 什麼是職場暗語15
經驗技巧14 名企iOS工程師行業訪談錄18
經驗技巧15 iOS開發的前景如何20
經驗技巧16 如何選擇iOS開發語言20
經驗技巧17 React Native 和Weex重要嗎21
經驗技巧18 企業對iOS開發者的要求有哪些22
經驗技巧19 iOS開發招聘有哪些要求24
經驗技巧20 iOS技術崗位面試精選27
面試筆試技術攻克篇
第1章 iOS開發基礎概念35
1.1 概念35
1.1.1 什麼是“套用瘦身”35
1.1.2 什麼是Cocoa和Cocoa Touch36
1.1.3 什麼是謂詞36
1.1.4 什麼是回響者鏈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套用的生命周期回調方法主要有哪些43
1.2.3 iOS套用有哪幾種不同狀態?分別表示什麼含義44
1.2.4 UIButton到NSObject之間的繼承關係是怎樣的45
1.2.5 Git和SVN有什麼異同45
第2章 Objective-C語言基礎47
2.1 Objective-C語言基礎特性47
2.1.1 Objective-C的優缺點有哪些47
2.1.2 相對於Objective-C而言,Swift有什麼新特性48
2.1.3 Foundation對象與Core Foundation對象有什麼區別52
2.1.4 Objective-C中的類方法和實例方法有什麼本質區別和聯繫53
2.1.5 子類初始化時為什麼要調用self = [super init]54
2.1.6 #import與#include以及#import<>與#import" "各有什麼區別54
2.1.7 Objective-C中@class代表什麼54
2.1.8 Objective-C中有二維數組嗎?如何實現55
2.1.9 在Objective-C的數組或字典中,添加nil對象會有什麼問題55
2.1.10 Objective-C中的可變和不可變類型是什麼56
2.2 數據類型57
2.2.1 在Objective-C中,常量有哪幾種類型57
2.2.2 Objective-C中數據類型的限定詞有哪些58
2.2.3 Objective-C中的NSInteger類型和C語言中的int類型有什麼區別59
2.2.4 NSNumber與NSInteger有什麼區別59
2.3 運算符和表達式60
2.3.1 在Objective-C中,前置運算和後置運算有什麼區別60
2.3.2 整型值和浮點值在賦值操作中如何相互轉換61
第3章 Objective-C語言的高級特性63
3.1 Objective-C中的屬性63
3.2 Objective-C語言的多態性72
3.2.1 什麼叫多態72
3.2.2 重載、重寫和隱藏的區別是什麼74
3.2.3 Objective-C和Swift中有重載嗎74
3.3 Objective-C語言的動態性75
3.3.1 什麼是編譯時與運行時79
3.3.2 所謂的Objective-C是動態運行時語言是什麼意思79
3.3.3 Objective-C中的id類型指的是什麼?id、nil代表什麼82
3.3.4 一般的方法method和Objective-C中的選擇器selector有什麼區別83
3.3.5 什麼時候會報unrecognized selector錯誤83
3.3.6 什麼是目標-動作機制83
3.3.7 在runtime中類與對象如何表示84
3.3.8 如何列印一個類中所有的實例變數85
3.3.9 如何使用runtime動態添加一個類87
3.3.10 如何在Category中增加屬性(關聯對象)88
3.3.11 如何理解訊息傳遞機制89
3.3.12 如何理解訊息轉發機制91
3.3.13 isKindOfClass和isMemberOfClass有什麼區別與聯繫94
3.3.14 Objective-C有私有方法嗎?有私有變數嗎94
3.4 Objective-C中的類別與擴展機制96
3.4.1 類別與其他特性(類擴展和繼承)有什麼區別97
3.4.2 Objective-C中類別特性的作用及其局限性是什麼97
3.4.3 類別和類擴展如何使用98
3.4.4 為什麼類別只能添加擴展方法而不能添加屬性變數101
3.5 Method Swizzling魔法102
3.5.1 Method Swizzling的套用場景有哪些102
3.5.2 如何使用runtime進行方法交換105
3.6 其他問題107
3.6.1 C和Objective-C如何混用107
3.6.2 Swift和Objective-C如何互調107
3.6.3 Objective-C對象可以被copy的條件是什麼109
3.6.4 Objective-C等同性中的字元串相等如何判斷110
3.6.5 一個Objective-C對象如何進行記憶體布局(考慮有父類的情況)111
第4章 Cocoa Touch框架相關112
4.1 UITableView112
4.1.1 UITableViewCell的復用原理是怎么樣的112
4.1.2 能否在一個視圖控制器中嵌入兩個tableView控制器114
4.1.3 一個tableView是否可以關聯兩個不同的datasource數據源115
4.1.4 如何對UITableView的滾動載入進行最佳化,防止卡頓116
4.2 UI視圖117
4.2.1 viewDidLoad和viewDidAppear的區別是什麼117
4.2.2 frame和bounds有什麼區別117
4.2.3 masksToBounds屬性是什麼?它有什麼作用118
4.2.4 tintColor 的作用是什麼118
4.2.5 UIViewController的生命周期方法有哪些118
4.2.6 View和View之間的傳值方式有哪些119
4.3 其他問題119
4.3.1 xib和storyboard相比各自的優缺點是什麼119
4.3.2 如何進行iOS 6和iOS 7的適配120
4.3.3 imageNamed和imageWithContentsOfFile有什麼區別120
4.3.4 UIDevice如何獲取設備信息120
4.3.5 iOS中是如何使用自定義字型的122
第5章 iOS開發中的對象間通信機制125
5.1 iOS中的Protocol和Delegate125
5.2 推送和通知126
5.2.1 什麼是訊息推送?和Notification有什麼區別126
5.2.2 什麼是Notification?什麼時候用Delegate或Notification128
5.2.3 NSNotification是同步還是異步129
5.3 Objective-C中的鍵值編碼和鍵值觀察130
5.3.1 什麼是鍵值編碼KVC?鍵路徑是什麼? 什麼是鍵值觀察KVC130
5.3.2 KVC的套用場景有哪些132
5.3.3 如何運用KVO進行鍵值觀察134
5.3.4 如何使用KVO設定鍵值觀察依賴鍵136
5.3.5 KVO的背後原理是什麼137
5.3.6 setValue:forKey:方法的底層實現是什麼138
5.3.7 NSMutableDictionary中setValue和setObject有什麼區別139
5.3.8 NSNotification、Delegate、Block和KVO的區別是什麼140
第6章 iOS中的圖層與動畫142
6.1 圖層142
6.1.1 UIView和CALayer的區別與聯繫是什麼142
6.1.2 什麼是Layer層對象143
6.1.3 如何使用CAShapeLayer繪製圖層146
6.1.4 iOS中如何實現為UIImageView添加圓角148
6.1.5 contentsScale屬性有什麼作用149
6.1.6 如何理解anchorPoint和position的作用150
6.1.7 如何理解drawRect:方法151
6.1.8 如何使用mask屬性實現圖層蒙版功能152
6.1.9 如何解決masksToBounds離屏渲染帶來的性能損耗153
6.1.10 QuartzCore和Core Graphics有什麼區別154
6.2 動畫154
6.2.1 UIView動畫原理是什麼?以UIView類的animateWithDuration方法為例154
6.2.2 什麼是隱式動畫和顯式動畫154
6.2.3 隱式動畫的實現原理是什麼?如何禁用圖層的隱式動畫155
6.2.4 CGAffineTransform和CATransform3D分別有什麼作用157
6.2.5 CATransition中過渡類型動畫有哪幾種type158
6.2.6 如何使用UIView動畫自定義過渡動畫159
6.2.7 如何理解並使用CAKeyframeAnimation160
6.2.8 如何自定義UIViewController之間的轉場動畫161
6.2.9 如何保持視圖界面為動畫結束時的狀態164
7.1 沙盒機制169
7.2 數據持久化方案170
7.2.1 iOS平台做數據的持久化方式有哪些170
7.2.2 如何使用NSUserDefault偏好設定保存數據170
7.2.3 如何使用NSUserDefault保存自定義對象171
7.2.4 什麼是序列化或者歸檔172
第8章 iOS中的記憶體管理174
8.1 記憶體管理174
8.1.1 什麼是記憶體泄漏?什麼是安全釋放174
8.1.2 殭屍對象、野指針、空指針分別指什麼?它們有什麼區別174
8.1.3 Objective-C有GC垃圾回收機制嗎175
8.1.4 在Objective-C中,與alloc語義相反的方法是dealloc還是release175
8.2 記憶體管理機制176
8.2.1 當使用block時,什麼情況會發生引用循環?如何解決176
8.2.2 CAAnimation的delegate是強引用還是弱引用176
8.2.3 按照默認法則,哪些關鍵字生成的對象需要手動釋放177
8.2.4 Objective-C是如何實現記憶體管理的179
8.2.5 如何實現autorealeasepool179
8.2.6 如果一個對象釋放前被加到了NotificationCenter中,不在NotificationCenter中,那么remove對象可能會怎樣181
8.2.7 NSArray和NSMutableArray在Copy和MutableCopy下的記憶體情況是怎樣的182
第9章 iOS中的網路和多執行緒編程183
9.1 iOS網路編程與多執行緒基礎183
9.1.1 什麼是執行緒?執行緒與進程有什麼區別?為什麼要使用多執行緒189
9.1.2 如何理解多執行緒190
9.1.4 HTTPS協定與HTTP協定有什麼區別與聯繫193
9.1.5 UIKit類要在哪一個套用執行緒上使用194
9.1.6 iOS中有哪幾種從其他執行緒回到主執行緒的方法195
9.1.7 用戶下載一個大圖片,分成很多份下載,如何使用GCD實現196
9.1.8 項目中什麼時候選擇使用GCD?什麼時候選擇NSOperation196
9.1.9 NSOpertion如何實現執行緒依賴196
9.1.10 什麼是執行緒死鎖197
9.1.11 dispatch_barrier_(a)sync的作用是什麼198
9.1.12 如何理解執行緒安全199
9.1.13 如何實現Cocoa中多執行緒的安全201
9.1.14 如何使用NSURLConnection進行網路請求202
9.1.15 如何使用NSURLSession進行網路請求205
9.2 block與GCD206
9.2.1 block有哪幾種定義的方式206
9.2.2 在ARC環境下,是否需要使用copy關鍵字來修飾block207
9.2.3 在block內如何修改block外部變數208
9.2.4 在block中使用self關鍵字是否一定導致循環引用209
9.2.5 GCD中有哪幾種佇列211
9.2.6 如何理解GCD死鎖211
9.2.7 如何使用GCD實現執行緒之間的通信212
9.2.8 GCD如何實現執行緒同步213
9.2.9 GCD多執行緒編程中什麼時候會創建新執行緒215
9.2.10 iOS中如何觸發定時任務或延時任務217
9.2.11 如何解決網路請求的依賴關係220
第10章 iOS其他話題221
10.1 iOS中函式回響式編程及ReactiveCocoa的使用221
10.1.1 什麼是ReactiveCocoa?如何使用221
10.1.2 如何使用RAC防止button短時間內重複單擊223
10.2 iOS基礎設計模式223
10.2.1 什麼是單例模式224
10.2.3 如何理解MVVM設計模式228
10.3 第三方框架229
10.3.1 SDWebImage是什麼?載入圖片的原理是什麼230
10.3.2 什麼是CocoaPods233
10.4 程式調試234
10.4.1 BAD_ACCESS在什麼情況下出現234
10.4.2 如何調試BAD_ACCESS錯誤235
10.4.3 如何查看設備套用的crash日誌235
10.4.4 如何檢測記憶體泄漏237
10.4.5 lldb(gdb)常用的調試命令有哪些237
第11章 資料庫239
11.1 資料庫基礎知識239
11.2 SQL語言的功能有哪些240
11.3 內連線與外連線有什麼區別242
11.4 什麼是事務243
11.5 什麼是存儲過程?它與函式有什麼區別與聯繫245
11.6 一二三四範式有什麼區別245
11.7 什麼是觸發器247
11.8 什麼是游標248
11.9 如果資料庫日誌滿了,那么會出現什麼情況249
11.10 union和union all有什麼區別249
11.11 什麼是視圖250
11.12 什麼是資料庫三級封鎖協定251
11.13 索引的優缺點有哪些251
第12章 作業系統253
12.1 進程管理253
12.1.1 進程與執行緒有什麼區別253
12.1.2 執行緒同步有哪些機制254
12.1.3 核心執行緒和用戶執行緒有什麼區別254
12.2 記憶體管理255
12.2.1 記憶體管理有哪幾種方式255
12.2.2 什麼是虛擬記憶體256
12.2.3 什麼是記憶體碎片?什麼是內碎片?什麼是外碎片256
12.2.4 虛擬地址、邏輯地址、線性地址、物理地址有什麼區別257
12.2.5 Cache替換算法有哪些257
12.3 用戶編程接口259
12.3.1 庫函式調用與系統調用有什麼不同259
12.3.2 靜態連結與動態連結有什麼區別259
12.3.3
靜態程式庫與動態程式庫有什麼區別260
12.3.4 用戶態和核心態有什麼區別260
12.3.5 用戶棧與核心棧有什麼區別261
附錄 262
真題1262
真題2264
真題3265
真題1答案267
真題2答案274
真題3答案281
參考文獻 290