书籍详情
Objective-C 2.0 Mac和iOS开发实践指南(原书第2版)
作者:(美)Robert Clair 著; 陈宗斌,李江晋 译
出版社:机械工业出版社
出版时间:2014-12-01
ISBN:9787111484561
定价:¥79.00
购买这本书可以去
内容简介
本书分为四部分。第一部分介绍学习Objective-C编程所需的C语言基础知识以及面向对象程序设计。第二部分介绍Objective-C编程的核心知识,包括消息机制、类和对象、类对象、动态链接库、Foundation类等。第三部分介绍Objective-C中的高级概念,涉及内存管理和Objective-C块。第四部分提供了Objective-C程序员常用的信息和资料。本书内容精练、可读性强、易于学习,侧重通过示例来介绍知识点和概念,是一本学习Objective-C2.0不可多得的入门实践指南。
作者简介
暂缺《Objective-C 2.0 Mac和iOS开发实践指南(原书第2版)》作者简介
目录
第1版赞誉
译者序
前言
致谢
第一部分 Objective-C简介
第1章C语言——Objective-C的基础2
1.1C程序的结构3
1.1.1main例程3
1.1.2格式化4
1.1.3注释4
1.1.4变量和函数名称5
1.1.5 命名约定5
1.1.6 文件6
1.2 变量6
1.2.1 整型7
1.2.2 浮点型8
1.2.3 真值8
1.2.4 初始化8
1.2.5 指针9
1.2.6 数组10
1.2.7 多维数组11
1.2.8 字符串11
1.2.9 结构12
1.2.10 typedef13
1.2.11 枚举常量13
1.3 运算符14
1.3.1 算术运算符14
1.3.2 余数运算符14
1.3.3 递增和递减运算符15
1.3.4 优先级15
1.3.5 取负运算符16
1.3.6 比较运算符16
1.3.7 逻辑运算符16
1.3.8 逻辑“非”运算符17
1.3.9 赋值运算符17
1.3.10 转换和强制转换18
1.3.11 其他赋值运算符19
1.4 表达式和语句19
1.4.1 表达式19
1.4.2 表达式求值20
1.4.3 语句20
1.4.4 复合语句20
1.5 程序流程20
1.5.1 if语句21
1.5.2 条件表达式22
1.5.3 while语句22
1.5.4 do-while循环23
1.5.5 for语句23
1.5.6 break语句24
1.5.7 continue语句24
1.5.8 逗号表达式25
1.5.9 switch语句25
1.5.10 goto语句26
1.5.11 函数27
1.5.12 声明函数29
1.6 预处理器29
1.6.1 包括文件29
1.6.2 #define30
1.6.3 条件编译30
1.6.4 printf31
1.7 命令行编译和调试33
1.8 小结35
1.9 练习35
第2章关于C变量的更多知识37
2.1 C程序的内存布局37
2.2 自动变量38
2.3 外部变量39
2.4 声明关键字40
2.4.1 auto40
2.4.2 extern40
2.4.3 static41
2.4.4 register41
2.4.5 const41
2.4.6 volatile42
2.5 作用域43
2.5.1 自动变量的作用域43
2.5.2 复合语句和作用域43
2.5.3 外部变量的作用域44
2.6 动态分配44
2.7 小结47
2.8 练习47
第3章面向对象程序设计简介49
3.1 面向对象程序设计49
3.1.1 类和实例50
3.1.2 方法50
3.1.3 封装50
3.1.4 继承51
3.1.5 多态性51
3.1.6 面向对象语言的主要特点是什么51
3.2 Objective-C简介52
3.2.1 定义类52
3.2.2 使用类名作为类型55
3.2.3 消息传递(调用方法)55
3.2.4 类对象和对象创建57
3.2.5 内存管理58
3.3 Objective-C的增补功能58
3.3.1 运行库58
3.3.2 名称59
3.3.3 消息表达式59
3.3.4 编译器指令59
3.3.5 字面量字符串60
3.3.6 Objective-C的关键字60
3.3.7 框架62
3.3.8 框架数值类型63
3.4 小结64
第4章你的第一个Objective-C程序65
4.1 利用Xcode构建程序65
4.2 Objective-C的程序结构69
4.3 面向对象的“Hello World”72
4.3.1 Greeter.h73
4.3.2 Greeter.m75
4.4 main.m78
4.5 小结80
4.6 练习80
第二部分 语 言 基 础
第5章消息传递84
5.1 方法84
5.1.1 一个简单的方法84
5.1.2 带有参数的方法85
5.2 消息传递87
5.3 消息传递的细节89
5.3.1 嵌套89
5.3.2 消息传递nil90
5.3.3 把消息发送给self91
5.3.4 重写并给super发送消息91
5.3.5 选择器93
5.3.6 具有相同名称的方法95
5.3.7 动态和静态类型化96
5.4 幕后的工作原理97
5.5 消息转发98
5.6 效率99
5.7 内省及其他运行库趣事101
5.8 小结102
5.9 练习102
第6章类和对象104
6.1 定义类104
6.1.1 接口部分104
6.1.2 @class指令106
6.1.3 实现部分106
6.1.4 导入107
6.2 子类化一个类108
6.2.1 定义子类108
6.2.2 子类化的示例108
6.2.3 类层次结构112
6.2.4 类层次结构示例112
6.2.5 抽象类113
6.3 创建对象114
6.3.1 对象分配114
6.3.2 对象初始化115
6.4 销毁对象122
6.5 复制对象123
6.5.1 浅复制和深复制124
6.5.2 可变复制和不可变复制124
6.5.3 在自己的类中实现复制125
6.6 小结127
6.7 练习128
第7章类对象129
7.1 类对象129
7.1.1 Class类型130
7.1.2 类方法132
7.2 其他类方法133
7.2.1 便利构造函数133
7.2.2 单例134
7.2.3 初始化类135
7.3 模拟类变量136
7.4 小结141
7.5 练习142
第8章框架144
8.1 框架是什么145
8.2 Cocoa和Cocoa Touch145
8.2.1 OS X146
8.2.2 iOS146
8.3 AppKit147
8.4 UIKit147
8.5 Core Foundation框架148
8.5.1 Core Foundation对象的内存管理149
8.5.2 免费桥接150
8.6 Core Graphics151
8.7 Core Animation152
8.8 Apple提供的其他框架153
8.9 第三方框架153
8.10 幕后的工作原理154
8.11 小结155
第9章常用的Foundation类156
9.1 不可变类和可变类156
9.2 类簇157
9.3 NSString158
9.3.1 NSString示例159
9.3.2 在C字符串与NSString之间来回转换161
9.3.3 NSMutableString161
9.3.4 字面量字符串162
9.4 集合类162
9.4.1 NSArray162
9.4.2 NSDictionary165
9.4.3 NSSet166
9.5 NSNumber167
9.6 NSNull169
9.7 NSData170
9.7.1 访问NSData的字节170
9.7.2 在文件与NSData之间转移内容171
9.8 NSURL171
9.9 Objective-C字面量和对象下标172
9.9.1 NSArray字面量172
9.9.2 NSDictionary字面量173
9.9.3 NSNumber字面量173
9.9.4 装箱表达式174
9.9.5 对象和下标176
9.9.6 给自己的类添加下标177
9.10 结构178
9.11 iOS上的几何结构180
9.12 小结180
9.13 练习180
第10章Objective-C中的控制结构183
10.1 if语句183
10.2 for语句和隐式循环187
10.2.1 for语句187
10.2.2 隐式循环188
10.2.3 带有块的隐式循环188
10.3 while语句和NSEnumerator189
10.4 快速枚举191
10.5 使用快速枚举的示例193
10.6 异常196
10.6.1 抛出你自己的异常197
10.6.2 多个@catch块198
10.6.3 嵌套的异常处理199
10.6.4 使用异常199
10.6.5 你应该使用异常吗200
10.7 小结201
10.8 练习202
第11章类别、扩展和安全204
11.1 类别204
11.1.1 利用类别重写方法207
11.1.2 类别的其他用途208
11.2 关联引用208
11.3 扩展210
11.4 实例变量作用域(访问控制)212
11.5 隐藏实例变量声明213
11.6 针对方法的访问控制215
11.7 命名空间216
11.8 安全216
11.9 从Objective-C中调用C函数219
11.9.1 技术部分219
11.9.2 实践部分219
11.9.3 哲学部分219
11.10 小结220
11.11 练习220
第12章属性222
12.1 在对象外面访问实例变量(不要这样做)223
12.2 声明和实现访问器224
12.3 使用属性的访问器226
12.4 合成的实例变量229
12.5 默认使用@synthesize229
12.6 合成总结230
12.6.1 显式声明230
12.6.2 默认的合成方式231
12.7 私有属性231
12.8 @property语句231
12.8.1 assign、retain和copy232
12.8.2 readwrite和readonly232
12.8.3 nonatomic233
12.8.4 setter=name和getter=name233
12.8.5 attributes和@dynamic233
12.9 关于@dynamic的更多知识234
12.10 没有实例变量的属性234
12.11 属性和内存管理235
12.12 提前探讨自动引用计数(ARC)236
12.12.1 strong236
12.12.2 weak237
12.12.3 unsafe_unretained237
12.13 子类化和属性237
12.14 用于readonly属性的隐藏的设置器238
12.15 属性作为文档239
12.16 点语法239
12.16.1 点语法和属性241
12.16.2 点语法和C结构241
12.17 小结243
12.18 练习244
第13章协议245
13.1 协议的理论基础245
13.2 使用协议246
13.2.1 声明协议246
13.2.2 采用协议247
13.2.3 协议作为类型248
13.2.4 属性和协议248
13.3 TablePrinter示例249
13.3.1 TablePrinterDataSource249
13.3.2 TablePrinter250
13.3.3 FruitBasket252
13.3.4 main253
13.3.5 一个问题254
13.3.6 实现可选方法255
13.4 协议对象和一致性测试255
13.5 非正式协议256
13.6 小结257
13.7 练习258
第三部分 高 级 概 念
第14章内存管理概述260
14.1 问题261
14.2 解决方案:Objective-C内存管理261
14.2.1 引用计数(手动引用计数)262
14.2.2 自动引用计数(ARC)262
14.3 继续学习下面的内容263
第15章引用计数264
15.1 引用计数的基础知识264
15.2 接收对象266
15.3 所有权268
15.4 dealloc269
15.5 返回对象270
15.5.1 自动释放272
15.5.2 自动释放池272
15.5.3 管理自动释放池273
15.5.4 回到便利构造函数上来274
15.5.5 自动释放和iOS275
15.5.6 使用额外的自动释放池控制内存使用275
15.6 retainCount276
15.7 多线程276
15.8 何时保留计数会出错278
15.9 保留循环280
15.10 最后说再见:曲终人散时283
15.11 小结283
15.12 练习284
第16章ARC286
16.1 ARC是什么,不是什么287
16.2 ARC的工作方式287
16.3 ARC会强加一些规则289
16.3.1 你不能自己调用内存管理方法289
16.3.2 ARC和dealloc289
16.3.3 方法命名约定290
16.3.4 ARC需要看到方法声明291
16.3.5 Objective-C指针和C结构292
16.4 新的变量修饰符293
16.4.1 __strong293
16.4.2 __weak294
16.4.3 __autoreleasing295
16.4.4 __unsafe_unretained295
16.5 属性296
16.6 保留循环298
16.7 ARC和Core Foundation300
16.7.1 从方法返回的CF对象301
16.7.2 免费桥接301
16.8 与void*之间来回进行强制转换303
16.9 ARC和额外的自动释放池305
16.10 ARC和异常306
16.11 使用ARC306
16.11.1 Mac OS X上的ARC306
16.11.2 iOS上的ARC307
16.11.3 利用ARC生成程序307
16.12 ARC使用运行库函数308
16.13 更多信息309
16.14 小结309
16.15 练习310
第17章块312
17.1 函数指针313
17.1.1 利用函数指针调用函数314
17.1.2 使用函数指针315
17.1.3 使用函数指针的问题317
17.2 NSInvocation318
17.3 块320
17.3.1 块指针320
17.3.2 访问变量321
17.3.3 块变量323
17.3.4 块是基于栈的324
17.3.5 全局块324
17.3.6 块是Objective-C对象325
17.3.7 复制块325
17.3.8 块的内存管理326
17.3.9 捕获self327
17.3.10 陷阱329
17.3.11 块和ARC330
17.3.12 Cocoa中的块331
17.3.13 风格问题334
17.4 一些哲学上的限制334
17.5 小结335
17.6 练习335
第18章 额外的知识337
18.1 具有固定的底层类型的枚举337
18.1.1 设置底层类型338
18.1.2 NS_ENUM宏339
18.1.3 类型检查枚举339
18.1.4 利用枚举参数检查switch语句340
18.2 在@implementation块中不再需要方法的前置声明340
18.3 一些新文档343
18.4 小结343
18.5 练习343
第四部分 附 录
附录A 保留字和编译器指令346
附录B 免费桥接类348
附录C 32位和64位350
附录D 脆弱的基类问题354
附录E 用于Objective-C的资源355
译者序
前言
致谢
第一部分 Objective-C简介
第1章C语言——Objective-C的基础2
1.1C程序的结构3
1.1.1main例程3
1.1.2格式化4
1.1.3注释4
1.1.4变量和函数名称5
1.1.5 命名约定5
1.1.6 文件6
1.2 变量6
1.2.1 整型7
1.2.2 浮点型8
1.2.3 真值8
1.2.4 初始化8
1.2.5 指针9
1.2.6 数组10
1.2.7 多维数组11
1.2.8 字符串11
1.2.9 结构12
1.2.10 typedef13
1.2.11 枚举常量13
1.3 运算符14
1.3.1 算术运算符14
1.3.2 余数运算符14
1.3.3 递增和递减运算符15
1.3.4 优先级15
1.3.5 取负运算符16
1.3.6 比较运算符16
1.3.7 逻辑运算符16
1.3.8 逻辑“非”运算符17
1.3.9 赋值运算符17
1.3.10 转换和强制转换18
1.3.11 其他赋值运算符19
1.4 表达式和语句19
1.4.1 表达式19
1.4.2 表达式求值20
1.4.3 语句20
1.4.4 复合语句20
1.5 程序流程20
1.5.1 if语句21
1.5.2 条件表达式22
1.5.3 while语句22
1.5.4 do-while循环23
1.5.5 for语句23
1.5.6 break语句24
1.5.7 continue语句24
1.5.8 逗号表达式25
1.5.9 switch语句25
1.5.10 goto语句26
1.5.11 函数27
1.5.12 声明函数29
1.6 预处理器29
1.6.1 包括文件29
1.6.2 #define30
1.6.3 条件编译30
1.6.4 printf31
1.7 命令行编译和调试33
1.8 小结35
1.9 练习35
第2章关于C变量的更多知识37
2.1 C程序的内存布局37
2.2 自动变量38
2.3 外部变量39
2.4 声明关键字40
2.4.1 auto40
2.4.2 extern40
2.4.3 static41
2.4.4 register41
2.4.5 const41
2.4.6 volatile42
2.5 作用域43
2.5.1 自动变量的作用域43
2.5.2 复合语句和作用域43
2.5.3 外部变量的作用域44
2.6 动态分配44
2.7 小结47
2.8 练习47
第3章面向对象程序设计简介49
3.1 面向对象程序设计49
3.1.1 类和实例50
3.1.2 方法50
3.1.3 封装50
3.1.4 继承51
3.1.5 多态性51
3.1.6 面向对象语言的主要特点是什么51
3.2 Objective-C简介52
3.2.1 定义类52
3.2.2 使用类名作为类型55
3.2.3 消息传递(调用方法)55
3.2.4 类对象和对象创建57
3.2.5 内存管理58
3.3 Objective-C的增补功能58
3.3.1 运行库58
3.3.2 名称59
3.3.3 消息表达式59
3.3.4 编译器指令59
3.3.5 字面量字符串60
3.3.6 Objective-C的关键字60
3.3.7 框架62
3.3.8 框架数值类型63
3.4 小结64
第4章你的第一个Objective-C程序65
4.1 利用Xcode构建程序65
4.2 Objective-C的程序结构69
4.3 面向对象的“Hello World”72
4.3.1 Greeter.h73
4.3.2 Greeter.m75
4.4 main.m78
4.5 小结80
4.6 练习80
第二部分 语 言 基 础
第5章消息传递84
5.1 方法84
5.1.1 一个简单的方法84
5.1.2 带有参数的方法85
5.2 消息传递87
5.3 消息传递的细节89
5.3.1 嵌套89
5.3.2 消息传递nil90
5.3.3 把消息发送给self91
5.3.4 重写并给super发送消息91
5.3.5 选择器93
5.3.6 具有相同名称的方法95
5.3.7 动态和静态类型化96
5.4 幕后的工作原理97
5.5 消息转发98
5.6 效率99
5.7 内省及其他运行库趣事101
5.8 小结102
5.9 练习102
第6章类和对象104
6.1 定义类104
6.1.1 接口部分104
6.1.2 @class指令106
6.1.3 实现部分106
6.1.4 导入107
6.2 子类化一个类108
6.2.1 定义子类108
6.2.2 子类化的示例108
6.2.3 类层次结构112
6.2.4 类层次结构示例112
6.2.5 抽象类113
6.3 创建对象114
6.3.1 对象分配114
6.3.2 对象初始化115
6.4 销毁对象122
6.5 复制对象123
6.5.1 浅复制和深复制124
6.5.2 可变复制和不可变复制124
6.5.3 在自己的类中实现复制125
6.6 小结127
6.7 练习128
第7章类对象129
7.1 类对象129
7.1.1 Class类型130
7.1.2 类方法132
7.2 其他类方法133
7.2.1 便利构造函数133
7.2.2 单例134
7.2.3 初始化类135
7.3 模拟类变量136
7.4 小结141
7.5 练习142
第8章框架144
8.1 框架是什么145
8.2 Cocoa和Cocoa Touch145
8.2.1 OS X146
8.2.2 iOS146
8.3 AppKit147
8.4 UIKit147
8.5 Core Foundation框架148
8.5.1 Core Foundation对象的内存管理149
8.5.2 免费桥接150
8.6 Core Graphics151
8.7 Core Animation152
8.8 Apple提供的其他框架153
8.9 第三方框架153
8.10 幕后的工作原理154
8.11 小结155
第9章常用的Foundation类156
9.1 不可变类和可变类156
9.2 类簇157
9.3 NSString158
9.3.1 NSString示例159
9.3.2 在C字符串与NSString之间来回转换161
9.3.3 NSMutableString161
9.3.4 字面量字符串162
9.4 集合类162
9.4.1 NSArray162
9.4.2 NSDictionary165
9.4.3 NSSet166
9.5 NSNumber167
9.6 NSNull169
9.7 NSData170
9.7.1 访问NSData的字节170
9.7.2 在文件与NSData之间转移内容171
9.8 NSURL171
9.9 Objective-C字面量和对象下标172
9.9.1 NSArray字面量172
9.9.2 NSDictionary字面量173
9.9.3 NSNumber字面量173
9.9.4 装箱表达式174
9.9.5 对象和下标176
9.9.6 给自己的类添加下标177
9.10 结构178
9.11 iOS上的几何结构180
9.12 小结180
9.13 练习180
第10章Objective-C中的控制结构183
10.1 if语句183
10.2 for语句和隐式循环187
10.2.1 for语句187
10.2.2 隐式循环188
10.2.3 带有块的隐式循环188
10.3 while语句和NSEnumerator189
10.4 快速枚举191
10.5 使用快速枚举的示例193
10.6 异常196
10.6.1 抛出你自己的异常197
10.6.2 多个@catch块198
10.6.3 嵌套的异常处理199
10.6.4 使用异常199
10.6.5 你应该使用异常吗200
10.7 小结201
10.8 练习202
第11章类别、扩展和安全204
11.1 类别204
11.1.1 利用类别重写方法207
11.1.2 类别的其他用途208
11.2 关联引用208
11.3 扩展210
11.4 实例变量作用域(访问控制)212
11.5 隐藏实例变量声明213
11.6 针对方法的访问控制215
11.7 命名空间216
11.8 安全216
11.9 从Objective-C中调用C函数219
11.9.1 技术部分219
11.9.2 实践部分219
11.9.3 哲学部分219
11.10 小结220
11.11 练习220
第12章属性222
12.1 在对象外面访问实例变量(不要这样做)223
12.2 声明和实现访问器224
12.3 使用属性的访问器226
12.4 合成的实例变量229
12.5 默认使用@synthesize229
12.6 合成总结230
12.6.1 显式声明230
12.6.2 默认的合成方式231
12.7 私有属性231
12.8 @property语句231
12.8.1 assign、retain和copy232
12.8.2 readwrite和readonly232
12.8.3 nonatomic233
12.8.4 setter=name和getter=name233
12.8.5 attributes和@dynamic233
12.9 关于@dynamic的更多知识234
12.10 没有实例变量的属性234
12.11 属性和内存管理235
12.12 提前探讨自动引用计数(ARC)236
12.12.1 strong236
12.12.2 weak237
12.12.3 unsafe_unretained237
12.13 子类化和属性237
12.14 用于readonly属性的隐藏的设置器238
12.15 属性作为文档239
12.16 点语法239
12.16.1 点语法和属性241
12.16.2 点语法和C结构241
12.17 小结243
12.18 练习244
第13章协议245
13.1 协议的理论基础245
13.2 使用协议246
13.2.1 声明协议246
13.2.2 采用协议247
13.2.3 协议作为类型248
13.2.4 属性和协议248
13.3 TablePrinter示例249
13.3.1 TablePrinterDataSource249
13.3.2 TablePrinter250
13.3.3 FruitBasket252
13.3.4 main253
13.3.5 一个问题254
13.3.6 实现可选方法255
13.4 协议对象和一致性测试255
13.5 非正式协议256
13.6 小结257
13.7 练习258
第三部分 高 级 概 念
第14章内存管理概述260
14.1 问题261
14.2 解决方案:Objective-C内存管理261
14.2.1 引用计数(手动引用计数)262
14.2.2 自动引用计数(ARC)262
14.3 继续学习下面的内容263
第15章引用计数264
15.1 引用计数的基础知识264
15.2 接收对象266
15.3 所有权268
15.4 dealloc269
15.5 返回对象270
15.5.1 自动释放272
15.5.2 自动释放池272
15.5.3 管理自动释放池273
15.5.4 回到便利构造函数上来274
15.5.5 自动释放和iOS275
15.5.6 使用额外的自动释放池控制内存使用275
15.6 retainCount276
15.7 多线程276
15.8 何时保留计数会出错278
15.9 保留循环280
15.10 最后说再见:曲终人散时283
15.11 小结283
15.12 练习284
第16章ARC286
16.1 ARC是什么,不是什么287
16.2 ARC的工作方式287
16.3 ARC会强加一些规则289
16.3.1 你不能自己调用内存管理方法289
16.3.2 ARC和dealloc289
16.3.3 方法命名约定290
16.3.4 ARC需要看到方法声明291
16.3.5 Objective-C指针和C结构292
16.4 新的变量修饰符293
16.4.1 __strong293
16.4.2 __weak294
16.4.3 __autoreleasing295
16.4.4 __unsafe_unretained295
16.5 属性296
16.6 保留循环298
16.7 ARC和Core Foundation300
16.7.1 从方法返回的CF对象301
16.7.2 免费桥接301
16.8 与void*之间来回进行强制转换303
16.9 ARC和额外的自动释放池305
16.10 ARC和异常306
16.11 使用ARC306
16.11.1 Mac OS X上的ARC306
16.11.2 iOS上的ARC307
16.11.3 利用ARC生成程序307
16.12 ARC使用运行库函数308
16.13 更多信息309
16.14 小结309
16.15 练习310
第17章块312
17.1 函数指针313
17.1.1 利用函数指针调用函数314
17.1.2 使用函数指针315
17.1.3 使用函数指针的问题317
17.2 NSInvocation318
17.3 块320
17.3.1 块指针320
17.3.2 访问变量321
17.3.3 块变量323
17.3.4 块是基于栈的324
17.3.5 全局块324
17.3.6 块是Objective-C对象325
17.3.7 复制块325
17.3.8 块的内存管理326
17.3.9 捕获self327
17.3.10 陷阱329
17.3.11 块和ARC330
17.3.12 Cocoa中的块331
17.3.13 风格问题334
17.4 一些哲学上的限制334
17.5 小结335
17.6 练习335
第18章 额外的知识337
18.1 具有固定的底层类型的枚举337
18.1.1 设置底层类型338
18.1.2 NS_ENUM宏339
18.1.3 类型检查枚举339
18.1.4 利用枚举参数检查switch语句340
18.2 在@implementation块中不再需要方法的前置声明340
18.3 一些新文档343
18.4 小结343
18.5 练习343
第四部分 附 录
附录A 保留字和编译器指令346
附录B 免费桥接类348
附录C 32位和64位350
附录D 脆弱的基类问题354
附录E 用于Objective-C的资源355
猜您喜欢