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

【黑马程序员】Category(分类)

2015-08-24 01:13 363 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

Category的概念及使用流程

Category声明和实现

Category使用注意

Category非正式协议

Category延展

Category的概念及使用流程

一、Category概念
Category有很多种翻译:分类\类别\类目(一般叫做分类)

Category是OC特有的语法,其他语言没有的语法(类似于C#语言中的”扩展方法”和”partial”关键字)

二、类别的作用
在不修改原有的类的基础上增加新的方法;

一个庞大的类可以分模块开发

一个庞大的类可以由多个人来编写,更有利于团队合作

三、使用类别的目的
1)对现有类进行扩展:

比如,你可以扩展Cocoa touch框架中的类,你在类别中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别

2) 作为子类的替代手段

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

3)对类中的方法归类

利用Category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护。这样条理更加清晰

三、使用类别的步骤
先声明类别->实现类别->使用类别

类别的命名规则:类名+扩展方法,如”NSString+countNum”。

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

Category声明和实现

1.声明一个类

在.h文件中,声明类别:

@interface ClassName(CategoryName)
NewMethod;  //在类别中添加方法
//不允许在类别中添加变量
@end


声明类格式:
1)新添加的方法必须写在@interface 与 @end 之间

2 ) ClassName 现有类的类别(要为哪个类扩展方法)

3)CategoryName 待声明的类别名称

4)NewMethod 新添加的方法

注意

不允许在声明类别的时候定义变量

不允许在声明类别的时候定义变量

不允许在声明类别的时候定义变量

重要的事情要说三遍

实现类别

在.m文件中(也可以在.h中实现),实现类别:

@implementation ClassName(CategoryName)
NewMethod
@end


实现类别格式:
1)新添加的方法必须写在@implementation与 @end 之间

2 ) ClassName 现有类的类名

3)CategoryName 待声明的类别名称

4)NewMethod 新添加的方法的实现

也可以通过图形界面生成类别





抵用类别中的方法

与一般成员方法调用形式完全一样

需要包含类别的头文件

Category使用注意

1.分类可以访问原来类中的成员变量
2.如果分类和原来类出现同名的方法,优先调用分类中的方法,原来类中的方法会被忽略
3.分类的编译顺序
最下面的是最后编译,当多个分类中有同名方法,则执行最后编译的文件方法



Category非正式协议

非正式协议就是给NSObject类创建的类目(分类)又叫做非正式协议,非正式协议一般不需要进行实现,一般在子类中进行方法的重写。

思考&实现:

统计一个字符串中阿拉伯数字的个数

NSString * str = @”asdjasdjsaldk1 1j2k1 2lkas”;

思路:

取出字符串的每一个字符

判断是否是0-9之间, 计数器+1

在NSString+count.h中

#import <Foundation/Foundation.h>
@interface NSString (count)
-(void)countStrNum;
@end

@implementation NSString (count)
-(void)countStrNum{
int count = 0;
for (int i = 0; i<self.length; i++){
unichar c = [self characterAtIndex: i];
if (c >= '0' && c <= '9'){
count++;
}
}
NSLog(@"count = %d", count);
}
@end


Category延展

1.延展概念
延展类别又称扩展(Extendsion)

Extendsion是Category的一个特例

其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)

@interface MyClass(){
float value;
}
-(void)setValue:(float)newValue;
@end


这种写法的类别叫匿名类别,又叫类扩展,其实就是为一个类添加额外的原来没有的变量、方法或者合成属性。

2、延展的实现
通过延展来实现方法的私有,延展的头文件独立。这种方法不能实现真正的方法私有,当在别的文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义的所谓的私有方法

.h文件
#import <Foundation/Foundation.h>

@interface Person : NSObject
@property int age;
-(void)run;
@end

//延展类别
//可以在延展中 定义实例变量
@interface Person()
{
float _weight;
}
-(void)run;
@end


.m文件

@implementation Person
-(void)run{
NSLog(@"延展的run方法");
}
@end
//注意,方法的实现不能写@implementation Person() @end不能有括号


第二种实现延展的方式是延展没有独立的头文件

.m文件
@interface Person()
-(void)run;
@end

@implementation Person
-(void)run{
NSLog(@"延展的run方法");
}
@end


在头文件中写一个对外开放的方法,在.m中声明和实现私有方法,让对象同过调用对外开放的方法来间接调用.m中的私有方法,这样就达到了延展中方法的私有
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: