前言
面试笔试经验技巧篇
经验技巧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章 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还是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.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?什么时候选择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.2 什么是MVC设计模式225
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
· · · · · · (
收起)