/*
Objective-c - category: 分类的使用和注意
当我们写一个类的时候,会涉及到一个类会有很多种方法.这个时候所有的方法都写在一个模块之中会显得很混乱,不好维护和管理.
在这个时候我们就可以给这个类添加分类,将不同的方法写在不同的分类当中,一个类占多个模块,方便维护和管理.
1> 分类的新建
新建一个分类文件会产生.h声明与.m实现两个文件.
文件名:本类名+分类名.h 本类名+分类名.m
2> 分类的声明
@interface 本类名 (分类名)
@end
表示不是新建了一个类,而是给已经存在的本类添加了一个分类.
3> 分类的实现
@implementation 本类名 (分类名)
@end
表示是给分类中的声明写实现
4> 如何理解分类
分类是本类的一部分.
将一个类中的成员按一定的规则分在了多个模块当中.
5> 分类的作用
将一个类分成了多个模块.将不同的方法写在不同的模块当中,方便后期维护和管理.
6> 分类的使用注意
1,分类中只能增加方法,不能增加属性.
2,分类中写@property只会生成setter/getter方法的声明,不会生成setter/getter方法的实现,也不会生成带有下划线的私有属性.
3,本类中写在@interface中的属性在分类中可以直接访问,本类中的真私有属性即写在@implementation之中的属性,在分类中无法访问,可以使用对应的setter/getter方法访问.
4,分类中的方法可以与本类中的方法同名,这个时候如果调用这个方法,会优先调用分类中的方法.如果多个分类中都有同名的方法,会优先调用最后编译的分类中的方法.
如下代码:
*/
#import <Foundation/Foundation.h>
#pragma mark -
#pragma mark #import "YYPerson.h"
//声明
@interface YYPerson : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,assign)int age;
- (void)run;
@end
//实现
@implementation YYPerson
- (void)run
{
NSLog(@"我在跑步!");
}
@end
#pragma mark -
#pragma mark #import "YYPerson+YYStuday.h"
//声明
@interface YYPerson (YYStuday)
- (void)study;
//与本类同名的方法
- (void)run;
@end
//实现
@implementation YYPerson (YYStuday)
- (void)study
{
NSLog(@"我在学习!");
}
//与本类同名的方法
- (void)run
{
NSLog(@"我在跑步我是分类YYStudy中的run方法!");
}
@end
#pragma mark -
#pragma mark #import "YYPerson+YYPlay.h"
//声明
@interface YYPerson (YYPlay)
- (void)play;
//与本类同名的方法
- (void)run;
@end
//实现
@implementation YYPerson (YYPlay)
- (void)play
{
NSLog(@"我在玩!");
}
//与本类同名的方法
- (void)run
{
NSLog(@"我在跑步我是分类YYPlay中的run方法!");
}
@end
#pragma mark -
#pragma mark main函数
int main(int argc, const char * argv[]) {
//创建人类对象
YYPerson *xiaoming = [YYPerson new];
//调用方法
[xiaoming run];//最后编译的run方法是分类YYPlayer中的.
[xiaoming study];
[xiaoming play];
return 0;
}