第1章 面向对象的编程 1
1.1 对象的概念 2
1.1.1 面向功能的软件设计的局限性 2
1.1.2 面向对象的模块化 2
1.1.3 消息传递 3
1.1.4 模块的抽象化 4
1.1.5 对象的属性 5
专栏 面向对象的方方面面 5
1.1.6 类 6
专栏 Cocoa和Obiective-C的历史 8
1.2 模块和对象 8
1.2.1 软件模块 8
1.2.2 高独立性的模块 9
1.2.3 模块的信息隐蔽 9
1.2.4 类的定义和接口 10
1.2.5 消息发送的实现 10
专栏 C语言的新标准 11
第2章 Objective-C程序设计 13
2.1 对象和消息 14
2.1.1 消息表达式 14
2.1.2 消息选择器 15
2.1.3 实例变量的生成和初始化 16
2.2 类的定义 17
2.2.1 类的接口声明 17
专栏 各种各样的布尔类型 18
专栏 不指定方法的返回值 18
2.2.2 类的实现 19
2.2.3 一个遥控器的例子 19
2.3 编译 21
2.3.1 简单的编译方法 21
2.3.2 多文件编译 23
2.4 程序的书写风格 24
2.4.1 混合编程 24
2.4.2 C语言函数的使用方法 25
2.4.3 静态变量的定义 26
2.4.4 头文件的引入 26
专栏 参考文档和SDK 27
专栏 Xcode的安装 28
第3章 类和继承 29
3.1 继承的概念 30
3.1.1 父类和子类 30
3.1.2 类的层次结构 31
3.2 利用继承定义新类 32
3.2.1 继承的定义 32
3.2.2 类定义和头文件 33
3.2.3 继承和方法调用 34
3.2.4 调用父类的方法 34
3.2.5 初始化方法的定义 35
3.3 使用继承的程序示例 36
3.3.1 追加新方法的例子 36
3.3.2 方法重写的例子 37
3.4 继承和方法调用 38
3.4.1 使用self调用方法 38
3.4.2 使用super调用方法 39
3.4.3 测试程序 40
3.5 方法定义时的注意事项 41
3.5.1 局部方法 41
3.5.2 指定初始化方法 42
专栏 Objective-C与开源软件 44
第4章 对象的类型和动态绑定 45
4.1 动态绑定 46
4.1.1 什么是动态绑定 46
4.1.2 多态 47
4.2 作为类型的类 48
4.2.1 把类作为一种类型 48
4.2.2 空指针nil 49
专栏 关系表达式 50
4.2.3 静态类型检查 51
4.2.4 静态类型检查的总结 53
4.3 编程中的类型定义 54
4.3.1 签名不一致时的情况 54
专栏 重载 55
4.3.2 类的前置声明 56
4.3.3 强制类型转换的使用示例 57
4.4 实例变量的数据封装 58
4.4.1 实例变量的访问权限 58
4.4.2 访问器 60
4.4.3 实例变量的可见性 61
4.4.4 在实现部分中定义实例变量 62
4.5 类对象 63
4.5.1 什么是类对象 63
4.5.2 类对象的类型 64
4.5.3 类方法的定义 65
4.5.4 类变量 65
4.5.5 类对象的初始化 66
4.5.6 初始化方法的返回值 68
第5章 基于引用计数的内存管理 69
5.1 动态内存管理 70
5.1.1 内存管理的必要性 70
5.1.2 引用计数、自动引用计数和自动垃圾回收 70
5.2 手动引用计数内存管理 71
5.2.1 引用计数 71
5.2.2 测试引用计数的例子 73
5.2.3 释放对象的方法 74
5.2.4 访问方法和对象所有权 75
专栏 静态对象 75
5.2.5 自动释放 76
5.2.6 使用自动释放池时需要注意的地方 77
5.2.7 临时对象的生成 77
5.2.8 运行回路和自动释放池 78
5.2.9 常量对象 78
专栏 常量修饰符const 79
5.3 分数计算器的例子 80
5.3.1 分数类Faction 80
5.3.2 保存计算结果的FracRegister类 83
5.3.3 主函数和执行示例 85
5.4 ARC概要 88
5.4.1 什么是ARC 88
5.4.2 禁止调用引用计数的相关函数 89
5.4.3 管理自动释放池的新语法 90
5.4.4 变量的初始值 90
5.4.5 方法族 90
5.4.6 方法dealloc的定义 92
5.4.7 使用ARC的程序的编译 93
5.4.8 ARC的基本注意事项 94
5.4.9 使用ARC重构分数计算器 94
5.5 循环引用和弱引用 95
5.5.1 循环引用 95
5.5.2 所有权和对象间的关系 96
5.5.3 弱引用 97
5.5.4 自动nil化的弱引用 98
5.5.5 对象之间引用关系的基本原则 99
5.6 ARC编程时其他一些注意事项 100
5.6.1 可以像通常的指针一样使用的对象 100
5.6.2 setter方法的注意事项 101
5.6.3 通过函数的参数返回结果对象 102
5.6.4 C语言数组保存Objective-C对象 103
5.6.5 ARC对结构体的一些限制 105
5.6.6 提示编译器进行特别处理 106
第6章 垃圾回收 107
6.1 垃圾回收的概要 108
6.1.1 查找不再使用的对象 108
6.1.2 编程时的注意事项 109
6.1.3 立圾收集器 110
6.1.4 finalize方法的定义 111
6.1.5 编译时的设定 112
6.1.6 引用计数管理方式中方法的处理 113
6.1.7 使用垃圾回收编程小结 114
6.2 垃圾回收的详细功能 114
6.2.1 分代垃圾回收 114
6.2.2 弱引用 115
6.2.3 自动nil化 115
6.2.4 通过垃圾回收回收动态分配的内存 116
6.2.5 __strong修饰符的使用方法 117
6.2.6 NSGarbageCollector类 117
6.2.7 实时API 118
6.3 内存管理方式的比较 119
6.3.1 引用计数和垃圾回收 119
6.3.2 更改内存管理方式 120
6.3.3 各种内存管理方式的比较 120
第7章 属性声明 123
7.1 属性是什么 124
7.1.1 使用属性编程 124
7.1.2 属性的概念 125
专栏 内省 125
7.2 属性的声明和功能 126
7.2.1 显式声明属性 126
7.2.2 属性的实现 127
7.2.3 @synthesize和实例变量 129
7.2.4 通过@synthesize生成实例变量 130
7.2.5 给属性指定选项 131
7.2.6 赋值时的选项 132
7.2.7 原子性 134
7.2.8 属性声明和继承 135
7.2.9 方法族和属性的关系 135
7.3 通过点操作符访问属性 136
7.3.1 点操作符的使用方法 136
7.3.2 复杂的点操作符的使用方法 137
7.3.3 何时使用点操作符 139
第8章 类NSObject和运行时系统 141
8.1 类NSObject 142
8.1.1 根类的作用 142
8.1.2 类和实例 142
8.1.3 实例对象的生成和释放 143
8.1.4 初始化 144
8.1.5 对象的比较 144
8.1.6 对象的内容描述 145
8.2 消息发送机制 145
8.2.1 选择器和SEL类型 145
8.2.2 消息搜索 146
8.2.3 以函数的形式来调用方法 147
专栏 函数指针 148
8.2.4 对self进行赋值 149
8.2.5 发送消息的速度 149
8.2.6 类对象和根类 152
8.2.7 Target-action paradigm 153
8.2.8 Xcoder中的动作方法和Outlet的写法 155
8.3 Objective-C和Cocoa环境 156
8.3.1 cocoa环境和Mac OSX 156
8.3.2 Cocoa Touch和iOS 156
8.3.3 框架 157
8.3.4 框架的构成和头文件 157
8.4 全新的运行时系统 159
8.4.1 对64位的对应和现代运行时系统 159
8.4.2 数据模型 159
8.4.3 64位模型和整数类型 159
8.4.4 Core Graprhics的浮点数类型 160
8.4.5 健壮实例变量 161
专栏 条件编译 162
第9章 Foundation框架中常用的类 163
9.1 对象的可变性 164
9.1.1 可变对象和不可变对象 164
9.1.2 可变对象的生成 165
9.2 字符串类NSString 166
9.2.1 常量字符串 166
9.2.2 NSStnng 167
9.2.3 NSMutableString 174
9.3 NSData 176
9.3.1 NSData 176
9.3.2 NSMutableData 178
9.4 数组类 179
9.4.1 NSArray 179
9.4.2 NSMutableArray 183
9.4.3 数组对象的所有权 184
9.4.4 快速枚举 185
9.4.5 枚举器NSEnumerator 186
9.4.6 快速枚举和枚举器 187
9.4.7 集合类 188
9.5 词典类 189
9.5.1 NSDictionary 191
9.5.2 NSMutableDicitionary 193
9.6 包裹类 194
9.6.1 NSNumber 194
9.6.2 NSValue 196
9.6.3 类型编码和@encode() 196
9.6.4 NSNull 197
9.7 NSURL 198
9.7.1 关于URL 198
9.7.2 NSURL的概要 199
9.7.3 使用NSURL来访问资源 201
第10章 范畴 203
10.1 范畴 204
10.1.1 范畴 204
10.1.2 范畴和文件的组织 205
10.1.3 作为子模块的范畴 206
10.1.4 方法的前向声明 207
10.1.5 私有方法 208
10.1.6 类扩展 209
10.1.7 范畴和属性声明 210
10.2 给现有类追加范畴 211
10.2.1 追加新的方法 211
10.2.2 追加方法的例子 212
专栏 可变参数的方法的定义 213
10.2.3 覆盖已有的方法 214
10.3 关联引用 215
10.3.1 关联引用的概念 215
10.3.2 添加和检索关联 215
10.3.3 对象的存储方法 216
10.3.4 断开关联 217
10.3.5 利用范畴的例子 217
第11章 抽象类和类簇 221
11.1 抽象类 222
11.1.1 什么是抽象类 222
11.1.2 抽象类的例子 223
11.2 类簇 228
11.2.1 类簇的概念 228
11.2.2 测试程序 229
11.2.3 编程中的注意事项 230
11.3 生成类簇的子类 231
11.3.1 使用范畴 231
11.3.2 基本方法的重定义 231
11.3.3 生成字符串的子类 233
第12章 协议 235
12.1 协议的概念 236
12.1.1 什么是协议 236
12.1.2 对象的协议 236
12.2 Objective-C中协议的声明 238
12.2.1 协议的声明 238
12.2.2 协议的采用 239
12.2.3 协议的继承 240
12.2.4 指定协议的类型声明 240
12.2.5 协议的前置声明 241
12.2.6 协议适用性检查 241
12.2.7 必选功能和可选功能 242
12.2.8 使用协议的程序示例 242
专栏 类的多重继承 245
12.3 非正式协议 246
12.3.1 什么是非正式协议 246
12.3.2 非正式协议的用途 246
专栏 使用宏(macro)来区分系统版本的差异 247
第13章 对象的复制及存储 249
13.1 对象的复制 250
13.1.1 浅复制和深复制 250
13.1.2 区域 251
13.1.3 复制方法的定义 251
13.1.4 复制方法的例子 252
13.1.5 实现可变复制 254
13.2 归档 255
13.2.1 对象的归档 255
13.2.2 Foundation框架的归档功能 255
13.2.3 归档方法的定义 256
13.2.4 归档的方法定义 257
13.2.5 归档和解档的初始化方法 258
13.3 属性表 259
13.3.1 属性表概况 259
13.3.2 ASCII码格式属性表 260
13.3.3 XML格式属性表 261
13.3.4 属性表的变换和检查 261
第14章 块对象 263
14.1 什么是块对象 264
14.1.1 C编译器和GCD 264
14.1.2 块对象的定义 264
14.1.3 块对象和类型声明 266
14.1.4 块对象中的变量行为 267
14.1.5 排序函数和块对象 269
14.2 块对象的构成 271
14.2.1 块对象的实例和生命周期 271
14.2.2 应该避免的编码模式 273
14.2.3 块对象的复制 273
14.2.4 指定特殊变量__block 274
14.3 Objective-C和块对象 276
14.3.1 方法定义和块对象 276
14.3.2 作为Objective-C对象的块对象 276
14.3.3 ARC和块对象 277
14.3.4 对象内变量的行为 277
14.3.5 集合类中添加的方法 279
14.3.6 在窗体中使用块对象 280
14.3.7 ARC中使用块对象时的注意事项 281
第15章 消息发送模式 283
15.1 应用和运行回路 284
15.1.1 运行回路 284
15.1.2 定时器对象 285
15.1.3 消息的延迟执行 286
15.2 委托 286
15.2.1 委托的概念 286
15.2.2 Cocoa环境中的委托 287
15.2.3 委托的设置和协议 288
15.2.4 使用委托的程序 289
15.3 通知 289
15.3.1 通知和通知中心的概念 289
15.3.2 通知对象 290
15.3.3 通知中心 291
15.3.4 通知队列 293
专栏 通知名或异常名的定义 294
15.4 反应链 294
15.4.1 反应链概述 294
15.4.2 应用中的反应链 295
15.5 消息转送 296
15.5.1 消息转送的构成 296
15.5.2 消息转送需要的信息 296
15.5.3 消息转送的定义 297
15.5.4 禁止使用消息 298
15.5.5 程序示例 298
15.6 撤销构造 300
15.6.1 撤销构造的概念 300
15.6.2 在撤销管理器中记录操作 301
第16章 应用的构造 303
16.1 应用束 304
16.1.1 应用束的构造 304
16.1.2 nib文件和各语言资源 305
专栏 指定语言和地区 305
16.1.3 信息文件的主要内容 306
16.1.4 通过NSBundle访问资源 308
16.1.5 iOS中资源的访问 310
16.1.6 通用二进制 311
16.2 加载nib文件 312
16.2.1 nib文件实例化 312
16.2.2 在Mac OS X中加载nib文件 313
16.2.3 在iOS中加载nib文件 313
16.2.4 nib文件内的包含循环 314
16.2.5 nib文件内对象的初始化 314
16.2.6 启动应用 314
16.3 iOS的文件保存场所 316
16.3.1 主要目录及功能 316
16.3.2 获取目录路径 317
16.4 用户默认 317
16.4.1 保存设定值 317
16.4.2 默认域 318
16.4.3 查找用户默认的工具 319
16.4.4 NSUserDefaults概要 319
16.5 应用的本地化 321
16.5.1 消息的本地化 321
16.5.2 本地化指针 322
专栏 本地化应用名 323
16.5.3 本地化 323
专栏 消息内的语序 324
16.6 模块的动态加载 324
16.6.1 可加载束 325
16.6.2 使用可加载束的程序 325
16.6.3 插件概述 326
专栏 沙盒(App Sandbox) 327
第17章 实例:简单图像视图 329
17.1 Application框架和Interface Builder 330
17.2 程序概况 330
17.2.1 对象间的关系 330
17.2.2 通知 331
17.2.3 撤销和重做 332
17.2.4 可加载束和本地化 332
17.2.5 用户默认 332
17.3 编程介绍 333
17.3.1 main函数和MyViewe rCtrl类 333
17.3.2 类WinCtr 336
17.3.3 类Mylnspector 341
17.4 应用束的组织 345
17.4.1 创建编译和设置文件 345
17.4.2 程序运行例子 346
17.4.3 GUI定义文件和程序 347
专栏 Objective-C调试器的功能 349
第18章 异常和错误 351
18.1 异常 352
18.1.1 异常处理的概念 352
18.1.2 Objective-C中的异常处理 352
18.2 异常处理机制概述 353
18.2.1 异常句柄和异常处理域 353
18.2.2 异常表示类NSException 353
18.2.3 异常处理机制的语法 354
18.2.4 简单的异常处理的示例程序 355
专栏 日志输出函数NSLog() 356
18.3 异常的发生和传播 357
18.3.1 异常的传播 357
18.3.2 自己触发异常 357
18.3.3 用@throw语法产生异常 357
18.3.4 @catch的特殊语法 358
18.3.5 异常传播和@finallv 358
18.3.6 异常处理程序的注意点 359
18.4 断言 360
18.4.1 断言是什么 360
18.4.2 断言宏 361
专栏 包含可变个数的参数的宏 361
18.5 错误处理 362
18.5.1 错误处理结构的目的 362
18.5.2 表示错误的类NSError的使用方法 362
18.5.3 获取错误对象的信息 364
18.5.4 生成自定义错误对象 364
18.6 错误反应链 366
18.6.1 错误反应链的结构 366
18.2.2 错误对象的更改和恢复 367
专栏 单元测试 369
第19章 并行编程 371
19.1 多线程 372
19.1.1 线程的基本概念 372
19.1.2 线程安全 372
19.1.3 注意点 373
19.1.4 使用NSThread创建线程 373
19.1.5 当前线程 374
19.1.6 GUI应用和线程 374
19.2 互斥 375
19.2.1 需要互斥的例子 375
19.2.2 锁 376
19.2.3 死锁 377
19.2.4 尝试获得锁 378
19.2.5 条件锁 378
19.2.6 NSRecursiveLock 379
19.2.7 @svnchronized 379
19.3 操作对象和并行处理 380
19.3.1 新的并行处理程序 380
19.3.2 使用NSOperation的处理概述 381
19.3.3 NSOperation和NSOperationOueue的简单用法 382
19.3.4 等待至聚合任务终止 383
19.3.5 使用操作对象的简单例子 383
19.3.6 NSInvocationOperation的使用方法 385
19.3.7 NSBlockOperation的使用方法 385
19.3.8 NSBlockOperation中添加多个块对象 386
19.3.9 设置任务间的依赖 386
19.3.10 任务的优先级设置 388
19.3.11 设定最大并行任务数 388
19.3.12 终止任务 389
19.3.13 设置队列调度为中断状态 389
19.4 并行处理的示例程序 390
19.4.1 程序概要 390
19.4.2 类BrowsingViewerCtrl 390
19.4.3 类BrowsingWinCt rl 392
19.4.4 类DrawOperation 394
19.4.5 其他改变 396
19.5 使用连接的通信 397
19.5.1 连接 398
19.5.2 代理 398
19.5.3 方法的指针参数 399
19.5.4 对象的副本传递 400
19.5.5 异步通信 401
19.5.6 设置协议 401
19.5.7 运行回路的开始 402
19.5.8 收发消息时的处理 402
19.5.9 线程间连接 404
19.5.10 进程间连接 406
19.5.11 进程间连接的例子 407
第20章 键值编码 411
20.1 键值编码概况 412
20.1.1 什么是键值编码 412
20.1.2 键值编码的基本处理 412
20.2 访问属性 414
20.2.1 键值编码的方法的行为 414
20.2.2 属性值的自动转换 415
20.2.3 字典对象和键值编码 416
20.2.4 根据键路径进行访问 416
20.2.5 一对一关系和一对多关系 417
20.2.6 数组对象和键值编码 419
20.3 一对多关系的访问 420
20.3.1 带索引的访问器模式 420
20.3.2 一对多关系的可变访问 421
20.4 KVC标准 422
20.4.1 验证属性值 422
20.4.2 键值编码的准则 423
20.5 键值观察 424
20.5.1 键值观察的基础 424
20.5.2 示例程序 426
20.5.3 一对多关系的属性监视 429
20.5.4 依赖键的登记 429
20.6 Cocoa绑定概述 430
20.6.1 目标-行为-模式的弱点 430
20.6.2 什么是Cocoa绑定 430
20.6.3 Cocoa绑定所需的方法 431
20.6.4 例题:绘制二次函数图的软件 432
20.6.5 自定义视图的方法定义 434