Category 类别
功能介绍:
Category 可以在已经存在的类里添加新的方法,在不改变已有类的情况下经行扩展!
而且ios 也提供了对字符串 NSString NSDictionary NSArray 的扩展,
主要作用:
category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,
网上说的3个作用
要有3个作用:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
继承可以增加,修改或者删除方法,并且可以增加属性。
下面的说法更容易让人理解 当其实说的都差不多
1. 在不创建继承类的情况下实现对已有类的扩展。
2. 简化类的开发工作(当一个类需要多个程序员协同开发的时候,Category可以将同一个类根据用途分别放在不同的源文件中,从而便于程序员独立开发相应的方法集合)。
3. 将常用的相关的方法分组。
4. 在没有源代码的情况下可以用来修复BUG。
注意事项
1 如果你添加的方法名和被扩展的类里类名相同,扩展的类会被覆盖!这的地方一定要注意,如何你覆盖了里面的方法可能引用bug,如果想覆盖这个方法最好弄清楚里面的调用情况或者在那个函数里面的代码的基础上进行扩展。
2 在使用Category 时 只能添加新的方法,不能添加新的变量
3 Category 的名字必须是唯一的 例如 @interface SetDogMessage(CATEGORY) 里的 CATEGORY 必须是唯一的
下面看下代码吧
创建了 一个SetDogMessage 类 两个变量,一个方法。
#import <Foundation/Foundation.h>
@interface SetDogMessage : NSObject
@property (strong,nonatomic)NSString * dogNameString;
@property (strong,nonatomic)NSString * dogAgeString;
-(void)dogLikeEatFood;
@end
/////////////////////////SetDogMessage/.m//////////////////////////
#import "SetDogMessage.h"
@implementation SetDogMessage
@synthesize dogAgeString;
@synthesize dogNameString;
-(void)dogLikeEatFood
{
NSLog(@"my dog name is %@, it age is %@ ,like eat bone",dogNameString,dogAgeString);
}
@end
现在我创建一个扩展的类 CategoryDogLikePlay
引用被扩展方法的头文件 #import "SetDogMessage.h"
改变 interface,implementation 的接口名字改成被扩展的类名,并设置一个Category 名字 如(CATEGORY)
#import <Foundation/Foundation.h>
#import "SetDogMessage.h"
@interface SetDogMessage(CATEGORY)
-(void)doglikeRun;
@end
//////////////////////////////CategoryDogLikePlay.m/////////////////////////文件
#import "CategoryDogLikePlay.h"
@implementation SetDogMessage(CATEGORY)
-(void)doglikeRun
{
NSLog(@"dog like run");
}
@end
- (void)viewDidLoad
{
[superviewDidLoad];
SetDogMessage *dog = [[SetDogMessagealloc]init];
dog.dogNameString = @"大黄";
dog.dogAgeString = @"10";
[dog dogLikeEatFood];
[dog doglikeRun ];
}