——黑马程序员——OC中的分类(Category)总结

来源:互联网 发布:苹果电脑设计绘图软件 编辑:程序博客网 时间:2024/06/07 09:33

-----------android培训java培训、java学习型技术博客、期待与您交流!-----------

OC中的分类(Category)

一、Category概念

Category,也称类别,类目,分类

是OC中特有的方法,其他语言中没有

二、Category作用

1、在不修改原有类的基础上给类增加新的方法

2、可以将一个庞大的类分成模块开发有多个人来编写

三、使用Category目的

1、对现有类进行扩展

2、作为子类的替代手段

不需要定义和使用一个子类,可以通过类别直接向自己的类里增加方法

3、对类中的方法归类

把一个庞大的类划分成小块

四、使用Category的步骤

先声明分类——实现分类——使用分类

注意:

1、分类的命名规则:类名+扩展方法,如“ NSString+countNum ”

2、类别的接口声明与类的定义十分相似,但分类不能继承父类,只需要带有一个括号,表明该分类的主要用途

五、分类的使用

1、声明类别

声明一个类:

@interface Person: NSobjet

@end

声明类别格式:@interface 待扩展的类名(分类的名称)

   @end

例如:声明一个类别

@interface Person (base)

-(void)eat;

-(void)run;

@end

2、实现类别

格式:

@implementation  待扩展的类名(类别的名称)

-(void)eat;

-(void)run;

@end

例如:

@implementation Person (base)

-(void)eat{

NSLog(@"人在吃");

}

-(void)run{

NSLog(@"人在跑");

}

@end

3、类别的使用

和使用类中原有的对象方法一样

#import <Foundation/Foundation.h>@interface Person: NSObject@end//声明一个类别@interface Person (base)-(void)eat;-(void)run;@end@implementation Person@end//实现一个类别@implementation Person (base)-(void)eat{NSLog(@"人在吃东西");}-(void)run{NSLog(@"人在跑");}@endint main (int argc, const char *argv[]) {     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];                                //类别测试代码        Person *p = [Person new];    //p调用类别    [p eat];    [p run];       [pool drain];    return 0;}

可以在项目文件中以类别的方式新建文件

六、类别的使用注意事项

1、在类别中不能声明实例变量,不能使用@property

2、类别中可以访问原来类中的实例变量

3、在类别中存在和类相同的方法名时 ,优先访问的而是类别中的方法,原类中的同名方法被忽略

4、在多个类别中有同名方法时,执行的是最后编译的类别中的同名方法

七、非正式协议

非正式协议就是类别,凡是NSObject、Foundation框架中的类或其子类增加的类别,都是非正式协议
给自己定义的类增加的类别是普通类别,不能称作非正式协议
#import <Foundation/Foundation.h>@interface Person: NSObject@end@implementation Person@end//类别声明@interface NSObject(run)-(void)run;@end//类别实现@implementation NSObject(run)-(void)run{NSLog(@"正在奔跑");}-(void)eat{NSLog(@"正在吃饭饭");}@endint main (int argc, const char *argv[]) {     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];                                //在此处输入Objective-C代码    Person *p = [Person new];    [p run];    [p eat];       [pool drain];    return 0;}


八、类别(Category)的延展

延展类别又称为扩展(Extendsion)、匿名类别,是类别的一个特例,

延展的名称为空,并且新添加的方法一定要实现

特点:

1、为添加额外的原来没有的变量

2、添加额外的原来没有的方法

3、延展不能在@implementation 类名 () 。。。@end中实现,在当前类中实现

4、一般将类别的延展放在 . m 文件中,可以定义相对私有的方法,可以通过self调用,也可以将它放在单独的 . h 文件中,在别的文件中引入此头文件就可以使用该延展中的方法

格式:

@interface  MyClass ( ){  //类扩展

...............................

}

扩展的实现是在当前类中实现,

九、类别和扩展的区别

1、类别中只能增加方法

2、类扩展中不但可以增加方法,还可以增加实例变量,该变量是私有的,子类不能继承也不能访问

3、类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中

4、类扩展 中声明的方法必须在相对应的类的实现部分来实现

5、在. m 文件中的类扩展方法为私有的,在 . h文件中的类扩展为公有的,类扩展是在 . m 文件中声明私有方法的最好方式











0 0
原创粉丝点击