16、OC 类别(category)与扩展(extension)
2014-12-09 12:05
246 查看
一、类别
OC可以为现有的类添加新的方法,并不需要通过继承的方式实现,也不需要访问原生代码,OC将这种动态特征称为类别,通过类别可以动态的为现有类添加新的方法,并且可以将类定义模块化地分布到多个相关文件中。
类别的定义方式与类有差异,类别以(类名+类别名)命名,语法格式如下:
接口部分:
@interface 已有类 (类别名)
//方法定义
//...
@end
实现部分:
#import “现有类+类别名.h"
@implementation
已有类 (类别名)
//方法实现
//...
@end
我们在IOS开发中也比较常用类别,比如我们有一个图片控件,但是我们需要为这个控件添加一个自动下载图片并缓存的功能,其他图片控件的功能不变,这时我们只需要使用类别就可以了。
关于类别,需要注意以下几点:
1.通过类别添加新的方法后,这个新方法不仅会影响已有类,还会影响到已有类的所有子类,所有子类都可以获得添加的方法。
2.OC允许类别重写已有类的方法,通常不推荐这么做,因为上面一条中可以知道,修改已有类,子类也会受影响。
3.如需重写已有类的方法,建议先通过已有类派生子类,子类重写父类原有方法。
4.可以根据需要为一个类定义多个类别,不同类别都可以对原有类添加方法。
5.不可以在类别中定义成员变量。
下面使用类别扩展NSNumber类:
测试:
二、扩展
扩展用于临时对某个类的接口进行扩展,类实现部分同时实现类接口部分定义的方法和扩展中定义的方法,定义扩展时可以额外定义实例变量。
定义扩展的格式如下,相当于一个匿名的类别。
@interface 已有类 (){
//实例变量
}
//方法定义
//...
@end
现在我们定义一个Person类,这个Person可以读书,我们为这个Person添加一个属性书名以及一个方法写作。
Person接口部分(Person.h):
Person+write接口部分(Person+write.h):
Person实现部分(Person.m):
测试:
结果:
正在读[b]OC开发[/b]
[b]小明正在写作[/b]
OC可以为现有的类添加新的方法,并不需要通过继承的方式实现,也不需要访问原生代码,OC将这种动态特征称为类别,通过类别可以动态的为现有类添加新的方法,并且可以将类定义模块化地分布到多个相关文件中。
类别的定义方式与类有差异,类别以(类名+类别名)命名,语法格式如下:
接口部分:
@interface 已有类 (类别名)
//方法定义
//...
@end
实现部分:
#import “现有类+类别名.h"
@implementation
已有类 (类别名)
//方法实现
//...
@end
我们在IOS开发中也比较常用类别,比如我们有一个图片控件,但是我们需要为这个控件添加一个自动下载图片并缓存的功能,其他图片控件的功能不变,这时我们只需要使用类别就可以了。
关于类别,需要注意以下几点:
1.通过类别添加新的方法后,这个新方法不仅会影响已有类,还会影响到已有类的所有子类,所有子类都可以获得添加的方法。
2.OC允许类别重写已有类的方法,通常不推荐这么做,因为上面一条中可以知道,修改已有类,子类也会受影响。
3.如需重写已有类的方法,建议先通过已有类派生子类,子类重写父类原有方法。
4.可以根据需要为一个类定义多个类别,不同类别都可以对原有类添加方法。
5.不可以在类别中定义成员变量。
下面使用类别扩展NSNumber类:
#import <Foundation/Foundation.h> @interface NSMutableArray (Num) //方法定义 -(void)addInt:(int)num; -(void)addDouble:(double)num; //... @end #import "NSMutableArray+Num.h" @implementation NSMutableArray (Num) -(void)addInt:(int)num{ [self addObject:[NSNumber numberWithInt:num]]; } -(void)addDouble:(double)num{ [self addObject:[NSNumber numberWithDouble:num]]; } @end
测试:
#import <Foundation/Foundation.h> #import "NSMutableArray+Num.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSMutableArray* array = [[NSMutableArray alloc]init]; //调用自己添加的方法 [array addInt:10]; [array addDouble:10.33]; //调用原生的方法 [array addObject:@"Hello"]; //打印 NSLog(@"%@",array); } return 0; }
二、扩展
扩展用于临时对某个类的接口进行扩展,类实现部分同时实现类接口部分定义的方法和扩展中定义的方法,定义扩展时可以额外定义实例变量。
定义扩展的格式如下,相当于一个匿名的类别。
@interface 已有类 (){
//实例变量
}
//方法定义
//...
@end
现在我们定义一个Person类,这个Person可以读书,我们为这个Person添加一个属性书名以及一个方法写作。
Person接口部分(Person.h):
#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic,copy) NSString* name; @property (nonatomic,assign) int age; -(void)read; @end
Person+write接口部分(Person+write.h):
#import <Foundation/Foundation.h> #import "Person.h" @interface Person () @property (nonatomic,copy) NSString* bookName; -(void)write; @end
Person实现部分(Person.m):
#import "Person+write.h" @implementation Person -(void)read{ NSLog(@"%@正在读%@",_name,_bookName); } -(void)write{ NSLog(@"%@正在写作",_name); } @end
测试:
<span style="font-size:14px;">#import <Foundation/Foundation.h> #import "Person+write.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person* person = [[Person alloc]init]; //访问原有属性 [person setName:@"小明"]; //访问扩展属性 [person setBookName:@"OC开发"]; //访问原有方法 [person read]; //访问扩展方法 [person write]; } return 0; }</span>
结果:
正在读[b]OC开发[/b]
[b]小明正在写作[/b]
相关文章推荐
- OC基础之类别(Category)和扩展(Extension)
- OC中的类别Category-协议Protocol-扩展Extension
- OC中分类(Category)和扩展(Extension)
- iOS类别(Category)与扩展(Extension)
- iOS类别(Category)与扩展(Extension)
- 灵活运用IOS类别(Category)和扩展(Extension)
- iOS类别(Category)与扩展(Extension)
- iOS category 类别 和 extension 扩展
- Objective-C----Category 类别、Extension 扩展 专题总结
- OC - 第七章 类的扩展: 类目Category, 延展Extension, 协议Protocol ( 一 )
- Category(类别)和扩展(Extension)的区别
- 11 类别(category)和扩展(extension)
- 比较iOS类别Category和扩展Extension以及runtime的associative(关联)机制(容我水一发)
- iOS类别(Category)与扩展(Extension)
- IOS中的类别(Category)和扩展(Extension)
- OC学习之道:OC中类别--Category类目的使用/Eetension类的扩展 的使用
- iOS类别(Category)与扩展(Extension)
- iOS类别(Category)与扩展(Extension)
- iOS开发之OC篇(12)—— Category(分类)、Extension(扩展)
- OC - 第七章 类的扩展: 类目Category, 延展Extension, 协议Protocol ( 二 )