【黑马程序员】OC-分类(Category)及延展(Extendsion)

原创 2015年11月18日 14:53:15

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


一、Category的概念及使用流程


1.分类的概念及作用


Category有很多种翻译:分类\类别\类目

Category是OC的特有语法


2.分类的作用


不用修改原有类的基础上增加新的方法

一个庞大的类分成若干个模块进行开发

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


3.使用类别的目的

1)对现有类进行扩展:

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

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

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


二、分类的声明和实现


<span style="font-size:14px;">main.m

/*
    分类:
        一些方法的声明和实现
 
    作用:在不修改类的源代码的前提下,给类增加新的功能
 
    使用步骤:
 
        1.声明一个分类
            
            格式:
                @interface 待扩展的类名(分类的名称)
        
                @end
 
        2.实现这个分类
 
            格式:
                @implementation 待扩展的类(分类的名称)
 
                @end
 
        3.使用分类中的方法
 
                和使用类中原有的对象方法一样
 
 
 */

#import <Foundation/Foundation.h>
#import "Person+Person_playGame.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //定义一个Person
        Person *p = [Person new];
        //调用分类的方法
        [p playDota];
        [p playLol];
    }
    return 0;
}


Person.h

//
//  Person.h
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

Person.m

//
//  Person.m
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import "Person.h"

@implementation Person

@end

Person+Person_playGame.h

//
//  Person+Person_playGame.h
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import "Person.h"

@interface Person (Person_playGame)
//增加一个类别,类别名称Person_playGame,给Person增加方法
-(void)playDota;
-(void)playLol;
@end

Person+Person_playGame.m

//
//  Person+Person_playGame.m
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import "Person+Person_playGame.h"

@implementation Person (Person_playGame)
-(void)playDota{
    NSLog(@"I play dota for SK"); //方法的实现
}
-(void)playLol{

    NSLog(@"I don't play LOL");
}
@end
</span>

三、分类的使用注意事项


1)分类只能增加方法,不能增加成员变量

2)在分类方法中可以访问员类中的成员变量

3)若分类中的方法和原类中的方法重名,优先使用分类中的方法

4)   当在多个类别中有同名的方法的时候,执行最后编译的那个类别的同名方法

<span style="font-size:14px;">//
//  main.m
//  分类的使用注意事项
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //定义一个 对象
        Person *p = [[Person alloc] init];
        //给age赋值
        p.age = 10;
        //调用run方法
        [p run];
    }
    return 0;
}

Person.h

//
//  Person.h
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property(nonatomic,assign)int age;  //定义一个变量

-(void)run;  //定义一个run方法
@end


//声明一个分类

@interface Person (base)

-(void)run;  //分类中定义一个run方法
@end

Person.m

//
//  Person.m
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import "Person.h"

@implementation Person

//实现run方法
-(void)run{
    
    NSLog(@"人在跑!");
}
@end


//实现分类
@implementation Person (base)

//实现分类中的run方法
-(void)run{
    
    //访问原类中的属性
    NSLog(@"age = %d",_age);
}

@end
</span>

四、分类非正式协议


1.非正式协议

非正式协议通常定义为NSObject的类别。

所谓非正式协议就是类别,即凡NSObject或其子类的类别,都是非正式协议

<span style="font-size:14px;">//
//  main.m
//  分类非正式协议
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "NSObject+run.h"
#import "NSString+numberCount.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //定义一个字符串
        NSString *str = @"as23da2s3dggs";
        //调用str的run方法
        [str run];
        
        //应用:统计一个字符串中阿拉伯数字的个数
        int result = [str countNmbForString];
        NSLog(@"%d",result);
    }
    return 0;
}

NSObject+run.h

//
//  NSObject+run.h
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSObject (run)
//定义一个方法
-(void)run;
@end

NSObject+run.m

//
//  NSObject+run.m
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import "NSObject+run.h"

@implementation NSObject (run)
-(void)run{
    //实现类方法
    NSLog(@"我在跑");
}
@end

NSString+numberCount.h

//
//  NSString+numberCount.h
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSString (numberCount)
-(int)countNmbForString;//定义方法
@end

NSString+numberCount.m

//  NSString+numberCount.m
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import "NSString+numberCount.h"

@implementation NSString (numberCount)
-(int)countNmbForString{    //方法的实现
    //定义一个变量来储存count
    int count = 0;
    //循环遍历字符串
    for (int i=0; i<self.length; i++) {
        unichar c = [self characterAtIndex:i];
        if (c>='0'&&c<='9') { //如果是数字,则count+1
            count++;
        }
    }
    return count;  //返回count
    
}
@end
</span>

五、分类延展的概念


1.类的延展的概念


延展类别有称为扩展(Extendsion)

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


@interface Person()

{

float _value;

}

-(void)setValue:(float) value;

@end


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


<span style="font-size:14px;">//
//  main.m
//  分类延展
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person_run.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //定义一个person
        Person *p = [Person new];
        //定义weight
        p.weight = 150;
        [p run];
    }
    return 0;
}


//
//  Person.h
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
@interface Person : NSObject

@end

//
//  Person.m
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import "Person.h"
#import "Person_run.h"
@implementation Person
//延展run方法的实现
-(void)run{
    
    _weight -=10;
    NSLog(@"当前的体重为:%.2f",_weight);
}
@end


//
//  Person_run.h
//  OCreview
//
//  Created by Brisinga on 15/11/18.
//  Copyright © 2015年 itcast. All rights reserved.
//

#import "Person.h"

@interface Person ()
//延展的变量声明
@property(nonatomic,assign) float weight;
//延展的run方法声明
-(void)run;
@end</span>


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

黑马程序员---OC学习笔记之分类(Category)延展

1、类的延展的概念 延展类别又称为【扩展Extendsion】 是Category的一个特例 其名字为匿名(空) 例如 @interface MyClass(){//扩展 float value; }...

黑马程序员——OC基础学习(五)---分类(Category),代码块Block和protocol代理设计模式

分类(Category),代码块Block和protocol代理设计模式知识总结

黑马程序员---OC基础---Block、分类Category、协议protocol

黑马程序员---OC基础---Block、分类Category、协议protocol

黑马程序员---OC分类-category

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———

黑马程序员_iOS开发之OC之面向对象之id语法、构造方法、@category分类、类本质、description方法和SEL数据类型

1、id语法

黑马程序员-IOS基础之OC分类(Category)

Objective C之Category 分类的语法非常好用,在我们以后的开发中也会经常使用,那么分类怎么用呢?分类的英文是Category,因为这个单词是从国外翻译过来的,所有有人叫它分类,也有人叫...

OC语言学习 (五) Category分类 和 类的延展Extension

分类: 在不修改原有的类的基础上增加新的方法 一个庞大的类可以分模块开发 一个庞大的类可以由多个人来编写,更有利于团队合作 除有的Person.h和Person.m,新增两个文件 Person+...

OC基础第六章:分类(category) 、延展(Extension)

一、分类(category) 1、类别概念 Category有很多种翻译: 分类 \ 类别 \ 类目 (一般叫分类) Category是OC特有的语法, 其他语言没有的语法(类似于C#语言中的”...

OC总结----类的方法.继承.NSString类的常用方法.NSMutableString 类的方法.数组类.字典类.block语法以及数组排序高级.属性.category (分类,类目).延展,等

1.在加号方法中不能使用实例变量,shi'il
  • RC_cong
  • RC_cong
  • 2014年08月17日 21:19
  • 731

OC Category 分类 Extension 延展.md

OC Category 分类 OC Extension 延展 分类的基本概念 分类的使用注意事项 方法的调用顺序 分类的执行顺序引出问题 类扩展的基本概念 Class Extension 匿名分类延...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【黑马程序员】OC-分类(Category)及延展(Extendsion)
举报原因:
原因补充:

(最多只允许输入30个字)