关闭

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

标签: iosoc分类类目延展
262人阅读 评论(0) 收藏 举报
分类:

------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>


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6233次
    • 积分:263
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档