您的位置:首页 > 编程语言 > Go语言

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类:
#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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息