【黑马程序员】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>


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

Objective-c:类目、延展、协议

概述OC用于拓展已存在类的内置功能是它最强大的功能之一。类目、延展、协议提供了可以让你扩展类功能的方式。使用他们,无需继承便可以扩展类功能。需要注意的是,这些手段只能增加类的方法,并不能用于增加实例变...
  • Hierarch_Lee
  • Hierarch_Lee
  • 2015年11月19日 08:59
  • 1677

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

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

黑马程序员——ios开发基础之OC中的分类、协议、延展和代理

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 第一讲  分类与延展 1、分类概念及作用       Category有很多种翻译: 分类 \ ...
  • Joker_999
  • Joker_999
  • 2015年09月19日 06:42
  • 348

黑马程序员——OC基础---分类(Category)、非正式协议及分类延展

黑马程序员——OC基础---分类(Category)、非正式协议及分类延展 ------- android培训、java培训、期待与您交流! ----------...
  • abuzzworld
  • abuzzworld
  • 2015年10月11日 17:27
  • 241

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

1、类的延展的概念 延展类别又称为【扩展Extendsion】 是Category的一个特例 其名字为匿名(空) 例如 @interface MyClass(){//扩展 float value; }...
  • chunhuayun
  • chunhuayun
  • 2015年10月08日 11:15
  • 230

OC-延展

概念在进行程序设计的时候,当需要对一些类添加新的方法,且这些方法不想被外部类调用,这时候需要延展的方法。...
  • qq_28264963
  • qq_28264963
  • 2016年08月16日 19:34
  • 118

黑马程序员-oc-分类(Q)

------- android培训、java培训、期待与您交流! ---------- 1,类别作用 在不修改原油的类的基础上增加新的方法 一个庞大的类可以分模块开发 一个庞大的类可以...
  • CQYCCCCC
  • CQYCCCCC
  • 2015年08月21日 22:58
  • 248

iOS中协议和延展的区别

延展部分 一、延展的介绍 延展也叫Extension,形式和类目相同,是一种特殊形式的类目(匿名类目),主要是为现有类添加私有方法,可以通过建立文件创建延展,也可以直接在现有类的.m中声明延展。 ...
  • Ant_Huzi
  • Ant_Huzi
  • 2015年12月27日 22:33
  • 418

iOS 类别(类目)与延展(扩展)区别讲义

我们在项目中或多或少都会接触到类别,延展,那么到底类别是什么,而延展又是什么呢?今天我们一块来探讨下: 类别就是为已存在的类添加新的方法,但是不能添加实例变量。比如系统的类,我们看不到他的.m文件,所...
  • baidu_31683691
  • baidu_31683691
  • 2016年01月14日 17:42
  • 2952

【OC】类的延展Extendsion

延展类别又称为扩展(Extendsion) Extension是Category的一个特例其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制) @interfac...
  • sinat_20559947
  • sinat_20559947
  • 2016年07月29日 21:36
  • 332
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【黑马程序员】OC-分类(Category)及延展(Extendsion)
举报原因:
原因补充:

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