IOS学习笔记-Category与Extension

来源:互联网 发布:淘宝客服是真人吗 编辑:程序博客网 时间:2024/04/29 10:22
Category概述
         Category是一种为现有的类添加新方法的方式,利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,
可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类),新添加的方法同样也会被被扩展的类的所有子类自动继承。当知道已有类中某个方法有BUG,但是这个类是以库的形式存在的,
我们无法直接修改源代码的时候,Category也可以用于替代这个已有类中某个方法的实体,从而达到修复BUG的目的。
然而却没有什么便捷的途径可以去调用已有类中原有的那个被替换掉方法实体了。需要注意的是,当准备有Category来替换某一个方法的时候,一定要保证实现原来方法的所有功能,
否则这种替代就是没有意义而且会引起新的BUG。和子类不同的是,Category不能用于向被扩展类添加实例变量。Category通常作为一种组织框架代码的工具来使用

Category的作用
1、将类的实现分散到多个不同的文件或者不同框架中(一个类需要多个人协同时,Category让一个类分散在不同的源文件中)
2、创建对私有方法的前向引用(可以理解为访问原类的私有方法,就是在基类中定义的私有方法,假如有一方法play,直接访问时不行的,需要在Category中的.h文件中,先声明一下,然后才可以调用)
3、向对象添加非正式协议
4、在不创建继承类的情况下实现对已有类的扩展。
5、在没有源代码的情况下可以用来修复BUG

分布类的局限性
有两个方面:
1、无法向类中添加新的实例变量
2、名称冲突,即当分布类中的方法与原始类方法名称冲突时,分布类具有更高的优先级,类别方法将完全取代初始方法从而无法使用初始方法

分布类与添加子类对比

并没有什么界限分明的判定标准来作为何时用Category何时用添加子类的方法的指导。但是有以下几个指导性的建议:
1、如果需要添加一个新的变量,则需添加子类。
2、如果只是添加一个新的方法,用Category是比较好的选择

Extension非常像是没有命名的Category。
一般的时候,Extension都是放在.m文件中@implementation的上方。
使用Extension需要注意的点:
(1) Extension中的方法必须在@implementation中实现,否则编译会报错。

Category与Extension区别
1、形式上来看,extension是匿名的category。
2、extension里声明的方法需要在mainimplementation中实现,category不强制要求。

3、extension可以添加属性(变量),category不可以

应用示例:Category,扩展NSString,添加方法,统计长度

头文件

@interface NSString (StringExtend)

-(NSNumber *)LengthNumber;

@end

实现文件

#import "NSString+StringExtend.h"

@implementation NSString (StringExtend)

-(NSNumber *)LengthNumber{
    NSInteger length = [self length];
    return [NSNumber numberWithInteger:length];
}


@end

调用:

    NSString * str = @"hello";
    NSLog(@"length:%@",[str LengthNumber]);


Extension示例:定义一个Person类

头文件:

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

实现文件,在实现文件中定义

#import "Person.h"

//Extension
@interface Person(){
    NSString *name;
}
-(void)Eat;

@end

@implementation Person

//必须实现
-(void)Eat{
    
}

@end


扩展Person类,定义PersonExtend继承Person,代码如下:

头部文件:

#import "Person.h"

@interface Person (PersonExtend)

-(void)Eat;

@end

实现文件:

#import "Person+PersonExtend.h"

@implementation Person (PersonExtend)

@end


调用(需要引入PersonExtend):

  Person * person =[[[Person alloc] init] autorelease];
    [person Eat];//Category的作用二,Category的作用中有说明




0 0
原创粉丝点击