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

黑马程序员---OC Category

2015-08-08 21:41 375 查看
类别的作用

在不修改原有的类的基础上增加新的方法
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作

使用类别的目的

1)对现有类进行扩展:

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

2)作为子类的替代手段:不需要定义和使用一个子类,可以通过类别直接向已有的类里增加方法。

3)对类中的方法归类:利用category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护。

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

@interface ClassName (CategoryName)

NewMethod; //在类别中添加方法,不允许在类别中添加变量

@end

声明类别格式

1)新添加的方法必须写在
@interface 与@end之间
2)ClassName
现有类的类名(要为哪个类扩展方法)

3)CategoryName
待声明的类别名称
4)NewMethod
新添加的方法

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

{
......
}
@end

实现类别格式

1)新方法的实现必须写在@
implementation与@end之间

2)ClassName
现有类的类名

3)CategoryName
待声明的类别名称

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

分类的使用注意事项

1)分类只能增加方法,
不能增加成员变量、@property(可能编译不报错,但是运行有问题
@interface
Person (study)
@property int age;
-(void)study;

-(void)work;
@end
#import
<Foundation/Foundation.h>
#import
"Person.h"
#import "Person+study.h"
int main(int
argc, const char
* argv[]) {
@autoreleasepool
{
Person *p = [Person
new];
[p
eat];

[p run];
p.age = 10;
}
return
0;


分类可以访问原来类中的成员变量

如:

#import <Foundation/Foundation.h>

//原类

@interface
Person : NSObject
{

    @public
   
int _age;
}

@end
//类别

@implementation Person (study){

     - (void)study{

     NSLog(@"age = %d",_age);

}

@end

int main(int argc,
const char * argv[]) {

    @autoreleasepool {

        //对象

        Person *p = [Person
new];

        [p study];

        

    }

    return
0;

}

非正式协议

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

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

NSString *str = @"ada12sfasdf1213234asfda 32424 121 aa11afdsf"; 

@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') {

//如果是阿拉伯数字,则+1

count++;}

}

NSLog(@"count = %d",count);} 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: