面试笔试经验技巧篇 2
经验技巧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
面试笔试技术攻克篇 35
第1章 iOS开发基础概念 35
1.1 概念 35
1.1.1 什么是“应用瘦身” 35
1.1.2 什么是Cocoa和Cocoa Touch 36
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和SceneKit 43
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 UITableView 112
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和Delegate 125
5.2 推送和通知 126
5.2.1 什么是消息推送?和Notification有什么区别 126
5.2.2 什么是Notification?什么时候用Delegate或Notification 128
5.2.3 NSNotification是同步还是异步 129
5.3 Objective-C中的键值编码和键值观察 130
5.3.1 什么是键值编码KVC?键路径是什么?什么是键值观察KVC 130
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中过渡类型动画有哪几种type 158
6.2.6 如何使用UIView动画自定义过渡动画 159
6.2.7 如何理解并使用CAKeyframeAnimation 160
6.2.8 如何自定义UIViewController之间的转场动画 161
6.2.9 如何保持视图界面为动画结束时的状态 164
第7章 iOS中的数据持久化 167
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还是release 175
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 如何实现autorealeasepool 179
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.3 如何理解HTTP协议 191
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?什么时候选择NSOperation 196
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与GCD 206
9.2.1 block有哪几种定义的方式 206
9.2.2 在ARC环境下,是否需要使用copy关键字来修饰block 207
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.2 什么是MVC设计模式 225
10.2.3 如何理解MVVM设计模式 228
10.3 第三方框架 229
10.3.1 SDWebImage是什么?加载图片的原理是什么 230
10.3.2 什么是CocoaPods 233
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
真题1 262
真题2 264
真题3 265
真题1答案 267
真题2答案 274
真题3答案 281
参考文献 290