黑马程序员_Category(分类)学习总结
2014-12-14 14:32
211 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
一.分类介绍
在开发项目的过程中,有时候需要为已有的类扩展一些新的行为。在不修改原来类代码的情况下,我们可以使用继承。通过继承,子类可以在父类的基础上添加新的方法。但有时候使用继承不是最好的选择。此时就需要分类(categoty)来实现。
1.使用分类可以在不改变原来类的模型(文件内容)的基础上为该类扩充方法。
二.定义分类
定义一个类别同样需要两个步骤:定义接口部分和定义实现部分。
分类的接口部分定义在.h文件中,通常文件名是: 类名+分类名.h
分类的实现部分定义在.m文件中,通常文件名是: 类名+分类名.m
1.接口部分
1>语法格式:
#import "已有类.h”
@interface 已有类 (分类名)
方法定义(方法声明)
...
...
@end
2>语法说明
1)分类只能为已有的类扩展方法
2)必须用圆括号包含分类名
3)@interface和@end之间通常只定义方法(方法声明)。
4)注意在当前文件中要包含这个已有类的头文件。
2.实现部分
1>语法格式:
#import "分类名.h"
@implementation 已有类 (分类名)
方法实现
...
...
@end
2>语法说明
1)已有类与分类声明部分中的类一致。
2)在@implementation和@end之间提供分类声明部分所声明方法的实现。
3)注意要包含分类接口的头文件。
三.分类使用细节与注意
1.分类方法实现中可以直接访问原始类在@interface中声明的成员变量,访问不到用@property在@implementation中生成的成员变量。因为我们在分类的.m文件中包含的只有分类的.h文件,而这个文件中只包含原来类的.h文件,而用@property生成的成员变量的声明在原来类的.m文件中。
程序示例 1:
/******Person.h文件******/
// Person类的接口部分
@interface Person : NSObject
@property (nonatomic, assign) int age; // 会在Person类的实现中生成_age成员变量。
@end
<span style="font-size:18px;">/******Person.m文件******/
#import "Person.h"
@implementation Person
// 会在这里生成_age成员变量
@end</span>
<span style="font-size:18px;">/******Person+PW.m文件******/
#import "Person+PW.h" // 在Person+PW.h中只包含了Person.h
@implementation Person (PW)
- (void)test
{
// _age成员变量的声明在Person.m中
_age = 10; // 编译报错,使用了没有声明的标识符_age
}
@end</span>
2.如果多个分类文件中实现了相同方法,调用方法时选择哪个方法由分类文件编译顺序决定,会调用最后编译的分类文件中的方法。
1>查看设置.m文件的编译顺序 :Build Phases —>compile Sources
3.方法调用的优先级(查找一个方法的顺序):分类(最后参与编译的分类优先) —>原来类—>父类
4.如果分类重新实现了原始类中的某个方法,那么将再也不能访问原来类中的那个方法了,这样的做法不推荐。
5.分类名命名规范:一般来说会以模块名命名或者方法的作用命名,还可以以作者命名。
四.利用分类对类进行模块化设计
当某个类非常大时,如果将该类所有实现代码放在一个文件中,将会导致这个文件非常大,以至于维护起来非常困难。
通常我们使用分类,将类的实现按模块分布到不同的*.m文件中,由多个人来编写,更有利于团队合作,提高项目后期的可维护性。
一.分类介绍
在开发项目的过程中,有时候需要为已有的类扩展一些新的行为。在不修改原来类代码的情况下,我们可以使用继承。通过继承,子类可以在父类的基础上添加新的方法。但有时候使用继承不是最好的选择。此时就需要分类(categoty)来实现。
1.使用分类可以在不改变原来类的模型(文件内容)的基础上为该类扩充方法。
二.定义分类
定义一个类别同样需要两个步骤:定义接口部分和定义实现部分。
分类的接口部分定义在.h文件中,通常文件名是: 类名+分类名.h
分类的实现部分定义在.m文件中,通常文件名是: 类名+分类名.m
1.接口部分
1>语法格式:
#import "已有类.h”
@interface 已有类 (分类名)
方法定义(方法声明)
...
...
@end
2>语法说明
1)分类只能为已有的类扩展方法
2)必须用圆括号包含分类名
3)@interface和@end之间通常只定义方法(方法声明)。
4)注意在当前文件中要包含这个已有类的头文件。
2.实现部分
1>语法格式:
#import "分类名.h"
@implementation 已有类 (分类名)
方法实现
...
...
@end
2>语法说明
1)已有类与分类声明部分中的类一致。
2)在@implementation和@end之间提供分类声明部分所声明方法的实现。
3)注意要包含分类接口的头文件。
三.分类使用细节与注意
1.分类方法实现中可以直接访问原始类在@interface中声明的成员变量,访问不到用@property在@implementation中生成的成员变量。因为我们在分类的.m文件中包含的只有分类的.h文件,而这个文件中只包含原来类的.h文件,而用@property生成的成员变量的声明在原来类的.m文件中。
程序示例 1:
/******Person.h文件******/
// Person类的接口部分
@interface Person : NSObject
@property (nonatomic, assign) int age; // 会在Person类的实现中生成_age成员变量。
@end
<span style="font-size:18px;">/******Person.m文件******/
#import "Person.h"
@implementation Person
// 会在这里生成_age成员变量
@end</span>
<span style="font-size:18px;">/******Person+PW.h文件******/ #import "Person.h" @interface Person (PW) - (void)test; @end</span>
<span style="font-size:18px;">/******Person+PW.m文件******/
#import "Person+PW.h" // 在Person+PW.h中只包含了Person.h
@implementation Person (PW)
- (void)test
{
// _age成员变量的声明在Person.m中
_age = 10; // 编译报错,使用了没有声明的标识符_age
}
@end</span>
2.如果多个分类文件中实现了相同方法,调用方法时选择哪个方法由分类文件编译顺序决定,会调用最后编译的分类文件中的方法。
1>查看设置.m文件的编译顺序 :Build Phases —>compile Sources
3.方法调用的优先级(查找一个方法的顺序):分类(最后参与编译的分类优先) —>原来类—>父类
4.如果分类重新实现了原始类中的某个方法,那么将再也不能访问原来类中的那个方法了,这样的做法不推荐。
5.分类名命名规范:一般来说会以模块名命名或者方法的作用命名,还可以以作者命名。
四.利用分类对类进行模块化设计
当某个类非常大时,如果将该类所有实现代码放在一个文件中,将会导致这个文件非常大,以至于维护起来非常困难。
通常我们使用分类,将类的实现按模块分布到不同的*.m文件中,由多个人来编写,更有利于团队合作,提高项目后期的可维护性。
相关文章推荐
- 黑马程序员——OC学习之分类category的使用
- 黑马程序员——OC基础学习(五)---分类(Category),代码块Block和protocol代理设计模式
- ——黑马程序员——OC中的分类(Category)总结
- 黑马程序员——OC语言学习——关键字id、构造方法、Category-分类、类的本质、 description方法、 SEL方法
- 黑马程序员---OC学习笔记之分类(Category)延展
- 黑马程序员---OC学习笔记之分类(Category)非正式协议【重点】
- 黑马程序员之ios学习总结——10 OC语言的构造方法和分类
- 黑马程序员——java语言基础——总结一下学习过的类
- 黑马程序员——学习总结
- MFC学习日记八:Mfc设置菜单项及消息分类(总结)
- 黑马程序员_交通灯管理系统学习总结
- 黑马程序员_学习日记7_C#基础归纳总结之泛型
- 黑马程序员_学习笔记1泛型及动态代理类的总结
- 黑马程序员Java学习-银行业务调度系统总结
- 黑马程序员---SQL入门学习总结
- 黑马程序员---关于对ADO.Net学习的总结
- 黑马程序员--学习总结(三)
- 黑马程序员_学习笔记8用类加载器的方式管理资源和配置文件及类加载器的总结
- 黑马程序员--c#学习总结(二)
- 黑马程序员_学习日记2_有关C#基础知识总结归纳之对象和类型