简介
Category也叫分类或类目,主要作⽤用是为没有源代码的类添加⽅方法, 还有另外一个作用就是可以方便你的代码管理(下面会详细说明)。通过Category添加的⽅法会成为原类的⼀部分。从而达到扩展⼀个类的功能。
如何定义Category
定义category很简单,在这里就不详细说了。
a. 新建文件(command + n)
b. 选择Objective-C Category模板 ( 【cocoa】 --> “Objective-C category”)
c. 填写类名和分类名
d. .h文件添加方法声明(添加要category的方法)
e. .m添加方法实现 (实现方法)
Category的声明
在介绍Category声明的同时,也说明了它的第一个好处:为没有源代码的类添加方法。
我们知道,在使用 NSDate 这个类的时候,它并没有提供一个直接设置时间格式并根据字符串初始化的初始化方法(或便利构造器),为了方便操作,我们可以通过Category 来 extension 这个方法。代码如下:
//
// NSDate+DateCategory.h
// lesson7
//
// Created by lin on 14-8-22.
// Copyright (c) 2014年 linshaolie. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSDate (DateCategory)//DateCategory是自定义的,在通过模板创建这个文件时可以指定
+ (NSDate*)dateWithFormatter:(NSString*)formatter andDateString:(NSString*)dateString;
@end
Category 的声明跟一般类的创建类似,只是把@interface 后面的继承关系改成了如代码所示的形式,这样我们就实现了Category 的声明。
Category的实现
接下来,要实现所 extension 的方法了。如下:
//
// NSDate+DateCategory.m
// testing
//
// Created by lin on 14-8-22.
// Copyright (c) 2014年 linshaolie. All rights reserved.
//
#import "NSDate+DateCategory.h"
@implementation NSDate (DateCatrgory)
+ (NSDate*)dateWithFormatter:(NSString*)formatter andDateString:(NSString*)dateString
{
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:formatter];
NSDate *date = [format dateFromString:dateString];
return date;
}
@end
可以看出,实现和一般类的实现也没什么太大区别,只是在类名后加了 (Category名称),其他一样。于是,实现部分也解决了。
下面对它进行 testing:
NSDate *date = [NSDate dateWithFormatter:@"yyyy/MM/dd HH:mm:SS" andDateString:@"2014/8/22 21:20:00"];
NSLog(@"date = %@", date);
Category的第二个好处(个人认为)
按住 command 键, 选择一个OC 的类(这里选NSDate),单击鼠标,进入API, 看图:
可以看到,该类并不是将所有的方法都写在类声明处, 而是通过Category进行分类,这样使得代码可读性更强,也方便代码的管理。
注意项:
a. 通过 Category extension 的方法可以被子类继承;
b. 不能直接通过 Category 为类添加实例变量,可以通过runtime机制动态挂载;
c. 新添加的方法会成为原始类的一部分,而且能被子类继承