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

OC学习笔记——类别(Category)

2015-07-25 13:41 519 查看
类别,有些程序员又称之为分类。

类别是一种为现有的类添加新方法的方式,尤其是为系统的做扩展的时候,不用继承系统类,可以直接为类添加新的方法。也可以覆盖系统类的方法。

如:

@interface NSObject (MyCategory)

- (void)myMethod;

@end

这样我们就给NSObject 添加了一个方法 myMethod()。

注意,一般情况下,我们只用分类为现有类添加方法,而很少为现有类添加属性。

假设我们有一个Person 类

person.h

@interface Person : NSObject
@property(nonatomic,strong) NSString *name;
@property(nonatomic,assign)NSUIteger age;
-(void)job;
@end


person.m

#import "Person.h"

@implementation Person
-(void)job{
NSLog(@"工作不加班,工作不加班");
}
@end


现在我们为Person创建一个分类

Person+Weapon.h

#import "Person.h"
@interface Person (Weapon)
-(void)fire;
@end


Person+Weapon.m

#import "Person+Weapon.h"

@implementation Person (Weapon)
-(void)fire{
NSLog(@"%@具备了开火的能力 ",self.name);
}
@end


main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+Weapon.h"
int main(int argc, const char * argv[])
{

@autoreleasepool {
Person *person = [[Person alloc]init];       
person.name = @"小王";
[person job];
[person fire];
}
return 0;
}


运行结果:
2015-07-25 13:35:06.111 分类[1065:68110] 工作不加班,工作不加班
2015-07-25 13:35:06.112 分类[1065:68110] 小王具备了开火的能力!

通过以上例子可以看出,本来类Person 只有一个job工作的能力,我们通过分类weapon,为Person添加了新的方法开火。

有时我们也需要运用分类给,可以使用runtime机制为类别添加属性。
方法如下:
1、在定义类别之前引如runtime
#import<obj/runtime.h>
2、定义、实现类别

Person+Weapon.h

#import <objc/runtime.h>
#import "Person.h"
@interface Person (Weapon)
@property (nonatomic,retain) NSString *address;//分类中添加的新属性address
-(void)fire;
@end


Person+Weapon.m

#import "Person+Weapon.h"
static const char *addressKey = "上海浦东";
@implementation Person (Weapon)
-(void)fire{
NSLog(@"%@具备了开火的能力!",self.name);
}
//getter
- (NSString *)address {
return (NSString *)objc_getAssociatedObject(self, addressKey);
}
//setter
- (void)setAddress:(NSString *)newAddressKey {
objc_setAssociatedObject(self, addressKey, newAddressKey, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end


main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+Weapon.h"
int main(int argc, const char * argv[])
{

@autoreleasepool {
TRPerson *person = [[Person alloc]init];
person.name = @"小王";
person.address = @"北京天安门";
NSLog(@"%@搬家到%@",person.name,person.address);
[person job];
[person fire];
}
return 0;
}


运行结果:

2015-07-25 14:01:09.672 分类[1097:76981] 小王搬家到北京天安门
2015-07-25 14:01:09.673 分类[1097:76981] 工作不加班,工作不加班
2015-07-25 14:01:09.673 分类[1097:76981] 小王具备了开火的能力!

类别的作用:

   (1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。(个人感觉最主要的作用就是欺骗编译器,如果编译器找不到相关的函数,我们可以用分类声明一个,不必实现而让编译器通过编译)
(3)向对象添加非正式协议。(非正式协议是NSObject的一个类别,他可以列出对象能够响应的方法)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: