您的位置:首页 > 职场人生

黑马程序员_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.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文件中,由多个人来编写,更有利于团队合作,提高项目后期的可维护性。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective c 分类