OC学习笔记——类别(Category)
2015-07-25 13:41
519 查看
类别,有些程序员又称之为分类。
类别是一种为现有的类添加新方法的方式,尤其是为系统的做扩展的时候,不用继承系统类,可以直接为类添加新的方法。也可以覆盖系统类的方法。
如:
@interface NSObject (MyCategory)
- (void)myMethod;
@end
这样我们就给NSObject 添加了一个方法 myMethod()。
注意,一般情况下,我们只用分类为现有类添加方法,而很少为现有类添加属性。
假设我们有一个Person 类
person.h
person.m
现在我们为Person创建一个分类
Person+Weapon.h
Person+Weapon.m
main.m
运行结果:
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
Person+Weapon.m
main.m
运行结果:
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的一个类别,他可以列出对象能够响应的方法)
类别是一种为现有的类添加新方法的方式,尤其是为系统的做扩展的时候,不用继承系统类,可以直接为类添加新的方法。也可以覆盖系统类的方法。
如:
@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的一个类别,他可以列出对象能够响应的方法)
相关文章推荐
- Django 1.8安装使用
- django 1.8 官方文档翻译: 2-6-3 提供初始数据
- 原 django获取url参数总结
- 百度站长平台:官网LOGO部分站点禁用
- Goldengate常见错误处理方式
- Goldengate性能优化
- Google最新截屏案例详解
- HDU 2111 Saving HDU (贪心)
- Django Rest Framework
- Got to spend the money somehow.
- 开发Google Material Design风格的WPF程序
- CodeForces#313 C. Gerald's Hexagon
- Django笔记 —— 模板高级进阶
- COdeforces 555 A. Case of Matryoshkas
- mongo sharding tag 实现本地写
- CF 559A(Gerald's Hexagon-几何割补法)
- Django 学习 1 基础概念
- 最新图解电信欢go的4G+技术,比快更快
- Codeforces Round #313 (Div. 2) C Gerald's Hexagon 计数
- go语言使用protobuf