Objective-C 类目
类目(类别):有时候我们封装了一个类,不想再动它了,可随着程序功能的增加,需要在原来的类中添加一个小小的方法.这个时候我们就不需要在原来的类中进行修改或者定义一个子类.只需要添加这个类的类目就可实现功能的添加.
类目的声明:
@interface NSString (StringMethod)
@end
该声明具有2个特点。首先,现有类位于@interface关键字之后,其后是位于圆括号中的一个新名称。该声明表示,类别的名称是StringMethod,而且该类别将向NSString类中添加方法。只要保证类别名称的唯一性,你可以向一个类中添加任意多得类别。
比如这里我们需要对NSString类添加一个类目StringMethod,那么文件名就是:
NSString+StringMethod.h
NSString+StringMethod.m
直接上代码
NSString+StringMethod.h
#import <Foundation/Foundation.h>
@interface NSString (StringMethod)
// 输入两个日期 判断两个日期是否在同一个月
-(BOOL)isEqualTwoDate:(NSString *)otherdate;
//拼接两个日期
- (NSString *)appendTwoDate:(NSString *)otherDate;
//给定两个时间,判断时间是否在这两个时间区间内
- (BOOL)isINTimeZone:(NSString *)beginTime end:(NSString *)endTime;
//传过去一个字符串,返回一个时间的对象NSDate
- (NSDate *)stringToDate;
+ (NSDate *)stringToDate:(NSString *)dateStr;
@end
NSString+StringMethod.m
#import "NSString+StringMethod.h"
@implementation NSString (StringMethod)
//这个方法需要两个参数,第一个参数就是方法的调用者,谁调用了这个方法,那么在这个方法的内部,self就是使用方法的那个对象.
-(BOOL)isEqualTwoDate:(NSString *)otherdate{
NSLog(@"%@",self);
NSString *month1 = [self substringWithRange:NSMakeRange(5,2)];
NSString *month2 = [self substringWithRange:NSMakeRange(5,2)];
return [month1 isEqualToString:month2];
}
//拼接两个日期
- (NSString *)appendTwoDate:(NSString *)otherDate{
NSString *newDate1 = [self substringToIndex:6];
NSString *newDate2 = [self substringFromIndex:11];
NSString *str = [NSString stringWithFormat:@"%@-%@",newDate1,newDate2];
return str;
}
//给定两个时间,判断时间是否在这两个时间区间内
- (BOOL)isINTimeZone:(NSString *)beginTime end:(NSString *)endTime{
return [self compare:beginTime] >0 && [self compare:endTime] < 0;
}
-(NSDate *)stringToDate{
//设置格式
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];
return [formatter dateFromString:self];
}
+(NSDate *)stringToDate:(NSString *)dateStr{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];
return [formatter dateFromString:dateStr];
}
@end
类目的局限性
第一,无法向类中添加新的实例变量。类别没有位置容纳实例变量。
第二,名称冲突,即类别中得方法与现有的方法重名。当发生名称冲突时,类别具有更高的优先级。你得类别方法将完全取代初始方法,从而无法再使用初始方法。有些编程人员在自己的类别方法中增加一个前缀,以确保不发生名称冲突。