第一部分 Objective-C简介 2
第1章 Objective-C简介 2
1.1 使用Xcode进行开发 3
1.1.1 新建项目 3
1.1.2 项目文件 5
1.1.3 添加源码文件 6
1.1.4 主Xcode窗口 7
1.2 理解编译过程 9
1.2.1 编码 9
1.2.2 源码、编译代码和可执行文件 11
1.2.3 查看应用包 11
1.2.4 编译设置 13
1.3 使用Xcode静态分析器 17
1.4 Objective-C运行时 20
1.5 小结 20
第2章 基本语法 21
2.1 使用语句和表达式 23
2.1.1 声明变量 23
2.1.2 使用注释 25
2.1.3 标量类型 25
2.1.4 使用特殊变量修饰符 26
2.1.5 结构体 28
2.1.6 使用类型定义 29
2.1.7 使用enum 30
2.1.8 指针 31
2.1.9 使用运算符 35
2.1.10 三目运算符 37
2.2 使用函数 37
2.2.1 函数 37
2.2.2 定义函数 39
2.2.3 实现与接口 41
2.2.4 链接实现文件 42
2.3 控制程序流 43
2.3.1 使用条件语句 44
2.3.2 使用循环语句 47
2.4 活学活用 50
2.5 小结 53
第3章 添加对象 54
3.1 对象 54
3.1.1 创建类 58
3.1.2 声明对象 64
3.1.3 调用对象方法 65
3.2 使用属性 66
3.2.1 状态和行为的区别 66
3.2.2 使用点标记 71
3.3 应用对象 72
3.3.1 创建员工对象 72
3.3.2 创建经理类 75
3.3.3 在HR主函数中关联不同的类 77
3.4 小结 78
第4章 Objective-C内存管理 79
4.1 使用引用计数 79
4.1.1 内存管理规则 81
4.1.2 使用自动释放 82
4.1.3 对象内部的内存 85
4.2 使用垃圾回收 88
4.2.1 垃圾回收器 88
4.2.2 为项目配置垃圾回收 90
4.2.3 在垃圾回收项目中使用框架 91
4.3 关键的垃圾回收模式 92
4.3.1 管理有限的资源 92
4.3.2 编写支持垃圾回收的基础应用 94
4.3.3 处理nib文件中的对象 94
4.3.4 强制垃圾回收 95
4.3.5 处理空指针和垃圾回收 95
4.3.6 使用垃圾回收的面向对象接口 96
4.4 项目使用的内存管理模型 97
4.5 小结 97
第二部分 更多特性 100
第5章 代码块 100
5.1 了解代码块 100
5.1.1 声明代码块 100
5.1.2 使用代码块 102
5.2 了解重要的代码块作用域 103
5.2.1 管理代码块内存 104
5.2.2 通过typedef提高代码块的可读性 105
5.3 在线程中使用代码块 106
5.3.1 使用GCD 106
5.3.2 使用GCD在线程中调度代码块 106
5.4 通用的代码块设计模式 107
5.4.1 将代码块作为映射 107
5.4.2 在标准API中使用代码块 108
5.5 在易并行任务中应用代码块 109
5.5.1 创建项目 109
5.5.2 在数组中使用代码块过滤素数 111
5.5.3 使用GCD 114
5.6 小结 116
第6章 键值编码和键值观察 117
6.1 通过键值编码访问对象属性 117
6.1.1 键路径 119
6.1.2 编写符合KVC标准的存取器方法 121
6.1.3 在数组中使用KVC 123
6.1.4 在结构体和标量中使用KVC 127
6.1.5 查找对象特性 128
6.2 观察对符合KVC标准的值的修改 128
6.2.1 使用KVO 129
6.2.2 注册成为观察者 129
6.2.3 定义KVO的回调 130
6.2.4 移除观察者 131
6.2.5 实现手动通知 132
6.2.6 使用KVO的风险 133
6.3 应用键值观察 133
6.4 小结 136
第7章 使用协议 137
7.1 优先使用组合而不是继承 137
7.1.1 了解为什么不需要(或不想要)多继承 139
7.1.2 理解协议如何解决问题 139
7.1.3 记录期望别人实现的接口 140
7.2 在对象中实现协议 141
7.2.1 声明协议 141
7.2.2 声明一个类实现了协议 143
7.2.3 声明一个必须实现协议的对象 143
7.2.4 正式协议和非正式协议 144
7.2.5 确定一个对象是否实现了可选方法 144
7.2.6 避免协议循环依赖 146
7.3 协议使用示例 146
7.4 小结 147
第8章 扩展现有类 148
8.1 使用第三方框架和类 148
8.2 使用类别 149
8.2.1 声明类别 149
8.2.2 实现类别方法 150
8.2.3 在头文件中声明类别 150
8.2.4 使用类别 150
8.2.5 通过类别拆分功能 151
8.2.6 扩展类方法 151
8.2.7 分析类别的局限性 153
8.2.8 通过类别实现协议 153
8.2.9 了解在NSObject上创建类别的风险 154
8.3 通过匿名类别扩展类 154
8.4 在现有类中关联变量 155
8.5 小结 157
第9章 编写宏 158
9.1 回顾编译过程 158
9.2 定义宏 162
9.2.1 定义常量 163
9.2.2 通过编译传递常量 163
9.2.3 在宏中使用变量 165
9.2.4 字符串化 165
9.2.5 使用条件判断 167
9.2.6 使用内置宏 167
9.3 小结 167
第10章 错误处理 168
10.1 错误分类 168
10.2 使用错误处理的不同机制 169
10.2.1 使用返回码 170
10.2.2 使用异常 171
10.2.3 使用NSError 176
10.3 小结 180
第三部分 使用Foundation框架 182
第11章 了解框架之间如何配合工作 182
11.1 了解Foundation框架 182
11.2 在项目中使用框架 184
11.2.1 添加框架 184
11.2.2 包含头文件 185
11.2.3 考虑垃圾回收 185
11.3 小结 185
第12章 使用字符串 186
12.1 了解字符串声明语法 186
12.1.1 使用格式化字符串 188
12.1.2 使用其他NSString方法 189
12.1.3 使用NSString类别 190
12.2 小结 190
第13章 使用集合 191
13.1 使用数组 191
13.1.1 使用字典 193
13.1.2 使用Set集合 195
13.1.3 认识可变性 196
13.2 了解集合和内存管理 198
13.3 遍历 200
13.4 向元素发送消息 201
13.5 排序和过滤 201
13.6 在集合中使用代码块 203
13.7 小结 204
第14章 使用NSValue、NSNumber和NSData 205
14.1 使用NSValue和NSNumber 206
14.1.1 通过NSValue包装任意数据类型 206
14.1.2 通过NSNumber包装数字 207
14.1.3 通过NSDecimalNumber进行算术运算 207
14.2 使用NSData和NSMutableData 208
14.2.1 创建NSData对象 208
14.2.2 访问NSData对象中的生数据 209
14.3 小结 209
第15章 处理时间和日期 210
构建日期 211
使用时间间隔 211
日期比较 211
使用NSCalender 212
使用时区 213
15.1 使用NSDateFormatter 214
15.2 小结 214
第四部分 高级主题 216
第16章 通过多个线程实现多处理 216
16.1 同步代码 217
16.1.1 使用锁 217
16.1.2 使用@synchronize关键字 219
16.1.3 理解原子性 220
16.2 创建NSTread 221
16.2.1 创建线程 221
16.2.2 控制运行的线程 221
16.2.3 访问主线程 222
16.2.4 通过执行选择器跨线程 223
16.3 使用NSOperation和NSOperationQueue 223
16.3.1 创建操作 224
16.3.2 将操作加入到队列 225
16.3.3 控制队列参数 225
16.3.4 使用不同的操作 226
16.4 小结 227
第17章 Objective-C设计模式 228
17.1 识别解决方案中的模式 228
17.2 用Objective-C描述设计模式 229
17.2.1 使用单例 229
17.2.2 委托责任 233
17.2.3 将变化通知给多个对象 234
17.3 小结 237
第18章 利用NSCoder读写数据 238
在对象上实现NSCoding协议 238
对象编码 238
基本类型编码 240
使用对象图 240
使用其他类型的数据 241
解码对象 242
18.1 使用NSArchiver和NSUnarchiver 243
18.2 处理存档文件格式和遗留数据 244
18.3 小结 244
第19章 在其他平台上使用Objective-C 245
19.1 使用GNUstep 245
19.1.1 使用Cocotron 247
19.1.2 使用其他开源库 248
19.2 展望未来 248
19.3 小结 249