第一部分 一种可控制一切的模式 2
第1章 模型-视图-控制器 2
1.1 Cocoa中的MVC 3
1.1.1 模型子系统的核心数据支持 3
1.1.2 视图子系统的应用程序工具箱支持 4
1.1.3 控制器子系统的应用程序工具箱支持 6
1.1.4 Cocoa的文本架构 7
1.1.5 Cocoa的文档架构 7
1.1.6 Cocoa编写脚本的能力 10
1.1.7 Cocoa的偏好窗格架构 11
1.1.8 Quartz Composer的架构 11
1.1.9 QTKit的架构 12
1.2 小结 12
第2章 分析和应用MVC 13
2.1 非MVC设计 13
2.2 MVC设计 17
2.3 小结 21
第二部分 基础模式 24
第3章 两阶段创建 24
3.1 动机 24
3.2 解决方案 25
3.2.1 分区 26
3.2.2 初始化已分配的内存 26
3.2.3 实现指定的初始化方法 27
3.2.4 在初始化方法中使用分区 29
3.2.5 创建临时实例 30
3.3 Cocoa中的示例 31
3.4 后果 35
第4章 模板方法 36
4.1 动机 36
4.2 解决方案 36
4.2.1 默认模板方法 38
4.2.2 利用模板方法进行设计 38
4.3 Cocoa中的示例 38
4.3.1 使用-drawRect:模板方法 39
4.3.2 其他Cocoa模板方法 39
4.4 后果 42
第5章 动态创建 43
5.1 动机 43
5.2 解决方案 43
5.2.1 使用动态创建 43
5.2.2 用动态创建实现插件架构 49
5.3 Cocoa中的示例 50
5.4 后果 50
第6章 类别 52
6.1 动机 52
6.2 解决方案 52
6.2.1 非正式协议 55
6.2.2 匿名类别 56
6.2.3 代码组织 57
6.2.4 何时使用类别与子类化 57
6.3 Cocoa中的示例 57
6.3.1 把类别用于组织 58
6.3.2 把类别用于非正式协议 58
6.3.3 把类别用于框架划分 60
6.4 后果 61
6.4.1 方法冲突 61
6.4.2 替换方法 61
6.4.3 软件维护 62
第7章 匿名类型和异类容器 63
7.1 动机 63
7.2 解决方案 63
7.2.1 匿名类型 64
7.2.2 赋值 66
7.2.3 异类容器 67
7.3 Cocoa中的示例 68
7.4 后果 68
第8章 枚举器 70
8.1 动机 70
8.2 解决方案 70
8.2.1 使用枚举器对象 70
8.2.2 使用快速枚举 71
8.2.3 创建自定义的枚举器 72
8.2.4 实现快速枚举 76
8.2.5 内部枚举 79
8.3 Cocoa中的示例 80
8.4 后果 80
第9章 执行选择器和延迟执行 82
9.1 动机 82
9.2 解决方案 82
9.2.1 延迟执行 84
9.2.2 Objective-C消息发送的实现 85
9.3 Cocoa中的示例 86
9.4 后果 87
第10章 访问器 89
10.1 动机 90
10.2 解决方案 90
10.2.1 引用计数的内存管理 91
10.2.2 管理保留计数的访问器 92
10.2.3 将内存管理限制在访问器中 95
10.2.4 可变性 95
10.2.5 NSKeyValueCoding 97
10.2.6 Interface Builder插座变量 98
10.2.7 Objective-C 2.0的属性 98
10.3 Cocoa中的示例 98
10.4 后果 101
第11章 归档和解档 102
11.1 动机 102
11.2 解决方案 102
11.3 Cocoa中的示例 105
11.3.1 实现NSCoding协议 106
11.3.2 编码和解码非对象类型 108
11.3.3 对象替换 110
11.3.4 nib意识 110
11.4 后果 111
第12章 复制 112
12.1 动机 112
12.2 解决方案 114
12.3 Cocoa中的示例 116
12.3.1 实现NSCopying 116
12.3.2 实现深复制 117
12.3.3 实现NSMutableCopying 118
12.3.4 必需的复制 119
12.3.5 复制Objective-C 2.0的属性 119
12.3.6 避免使用NSCopyObject() 121
12.4 后果 121
第三部分 主要通过解耦来变得更强大的模式第13章 单例 124
13.1 动机 124
13.2 解决方案 124
13.2.1 封装共享资源 124
13.2.2 创建和访问共享实例 126
13.2.3 控制实例化 127
13.2.4 取消分配 129
13.2.5 确定是否创建了单例 130
13.2.6 线程安全 130
13.2.7 与Interface Builder协作 130
13.3 Cocoa中的示例 131
13.4 后果 132
第14章 通知 133
14.1 动机 133
14.2 解决方案 134
14.2.1 MYNotification类 134
14.2.2 MYNotificationCenter类 135
14.2.3 联合存储 140
14.3 Cocoa中的示例 140
14.3.1 全局通知名称 140
14.3.2 “Will”和“Did”通知 141
14.3.3 同步通知与异步通知 141
14.3.4 分布式通知 143
14.4 后果 144
第15章 委托 146
15.1 动机 146
15.2 解决方案 149
15.2.1 实现委托支持 150
15.2.2 实现委托 155
15.2.3 数据源 156
15.3 Cocoa中的示例 157
15.4 后果 157
第16章 层次结构 159
16.1 动机 159
16.2 解决方案 159
16.2.1 实现层次结构 160
16.2.2 Cocoa视图层次结构 162
16.2.3 视图层次结构中的坐标系统 163
16.2.4 浏览视图层次结构 164
16.3 Cocoa中的示例 171
16.4 后果 171
第17章 插座变量、目标和动作 172
17.1 动机 173
17.2 解决方案 173
17.2.1 插座变量 176
17.2.2 目标 176
17.2.3 动作 176
17.2.4 动作和响应者链 178
17.3 Cocoa中的示例 179
17.4 后果 181
第18章 响应者链 183
18.1 动机 183
18.2 解决方案 183
18.2.1 术语 183
18.2.2 响应者链 184
18.2.3 扩展的响应者链 185
18.2.4 遍历扩展的响应者链 187
18.2.5 插入对象到响应者链中 188
18.2.6 利用响应者链 189
18.3 Cocoa中的示例 191
18.4 后果 191
第19章 联合存储 192
19.1 动机 192
19.2 解决方案 192
19.3 Cocoa中的示例 195
19.3.1 引用计数的内存管理 195
19.3.2 键值编码 198
19.4 后果 198
第20章 调用 200
20.1 动机 200
20.2 解决方案 200
20.2.1 方法签名 200
20.2.2 使用NSInvocation对象 201
20.2.3 使用计时器 205
20.2.4 延迟的消息发送 209
20.3 Cocoa中的示例 210
20.4 后果 211
第21章 原型 212
21.1 动机 212
21.2 解决方案 212
21.3 Cocoa中的示例 214
21.3.1 使用MYLabeledBarCell实例作为原型 214
21.3.2 使用MYColorLabeledBarCell实例作为原型 216
21.4 后果 218
第22章 享元 219
22.1 动机 219
22.2 解决方案 219
22.3 Cocoa中的示例 219
22.3.1 封装非对象值 220
22.3.2 减少存储需求 220
22.3.3 替代其他对象 221
22.4 后果 222
第23章 装饰器 223
23.1 动机 224
23.2 解决方案 224
23.3 Cocoa的示例 225
23.4 后果 226
第四部分 主要用于隐藏复杂性的模式 228
第24章 包 228
24.1 动机 228
24.2 解决方案 228
24.3 Cocoa中的示例 230
24.4 后果 232
第25章 类簇 233
25.1 动机 233
25.2 解决方案 233
25.3 Cocoa中的示例 237
25.3.1 子类化类簇的公共接口类 238
25.3.2 NSString的MYShortString子类 239
25.3.3 从MYShortString获得的经验教训 248
25.4 后果 248
第26章 外观 250
26.1 动机 250
26.2 解决方案 251
26.3 Cocoa中的示例 254
26.3.1 文本外观 254
26.3.2 图像外观 255
26.3.3 持久存储外观 255
26.3.4 用户交互外观 256
26.4 后果 257
第27章 代理和转发 258
27.1 动机 258
27.2 解决方案 258
27.2.1 实现转发 258
27.2.2 代理 259
27.2.3 高阶消息 265
27.3 Cocoa中的示例 270
27.4 后果 270
第28章 管理者 271
28.1 动机 271
28.2 解决方案 271
28.2.1 扩展单例模式 272
28.2.2 添加其他管理者特性 275
28.3 Cocoa中的示例 277
28.4 后果 277
第29章 控制器 279
29.1 动机 279
29.2 解决方案 279
29.2.1 MYShapeDraw模型子系统 280
29.2.2 MYShapeDraw视图子系统 281
29.2.3 MYShapeEditor控制器子系统 283
29.2.4 扩展MYShapeDraw视图子系统以进行编辑 292
29.2.5 重新设计和泛化解决方案 294
29.3 Cocoa中的示例 299
29.4 后果 300
第五部分 模式应用的实用工具 304
第30章 核心数据模型 304
30.1 模型子系统的角色 304
30.2 核心数据的术语 305
30.2.1 实体 305
30.2.2 特性 305
30.2.3 关系 306
30.2.4 属性 306
30.3 核心数据内模式之间的协作 307
30.3.1 NSManagedObject和NSEntityDescription 307
30.3.2 设计核心数据模型 312
30.3.3 NSManagedObjectContext 312
30.3.4 NSPersistentStoreCoordinator和NSPersistentStore 313
30.4 核心数据的局限性和好处 314
第31章 应用程序工具箱视图 315
31.1 视图子系统的角色 315
31.2 应用程序工具箱内的模式之间的协作 316
3 1.2.1 NSApplication、事件和运行循环 316
31.2.2 响应者 317
31.2.3 响应者链 317
31.2.4 NSWindow概述 318
31.2.5 NSView概述 319
31.2.6 目标和动作 321
31.2.7 归档的对象和nib 322
31.2.8 撤销和重做 324
31.2.9 管理者 324
31.3 应用程序工具箱的局限性和好处 325
第32章 绑定和控制器 326
32.1 绑定和控制器的角色 326
32.1.1 绑定避免耦合 328
32.1.2 结合使用控制器与绑定的重要性 328
32.2 绑定和控制器内的模式之间的协作 329
32.2.1 在-bind:toObject:withKeyPath:options:中发生了什么事情 330
32.2.2 键值观察如何检查对所观察属性的更改使得观察对象可以得到通知 330
32.2.3 在观察的属性的值改变时发送什么消息来通知注册的观察者 331
32.3 绑定和控制器的局限性和好处 333
附录 资源 334