过度的创建NSDateFormatter用于NSDate与NSString之间转换,会导致App卡顿,打开Profile工具查一下性能,你会发现这种操作占CPU比例是非常高的。所以我们需要优化一下。
在iOS 7之前NSDateFormatter线程是不安全的,在iOS
7之后NSDateFormatter线程是安全的,但是现在iOS
7被舍弃了,所以我们只考虑线程是安全的就可以了。
三种方式对比以及测试方法:
第一种:普通创建
//
普通创建方式
- (void)Normal {
CFAbsoluteTime startTime =
CFAbsoluteTimeGetCurrent();
for (int
i = 0; i <
100000; i ++) {
NSDateFormatter *dataFormatter = [[NSDateFormatter
alloc]init];
}
CFAbsoluteTime stopTime =
CFAbsoluteTimeGetCurrent();
NSLog(@"%s :%f",__func__,stopTime
- startTime);
}
第二种:单例方法
FormatterManger.h文件
#import
<Foundation/Foundation.h>
@interface FormatterManger :
NSDateFormatter
+(instancetype)formatterManger;
@end
FormatterManger.m文件
#import
"FormatterManger.h"
static
FormatterManger *instanceType =
nil;
@implementation FormatterManger
+(instancetype)formatterManger{
static
dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instanceType = [[FormatterManger
alloc]init];
});
return
instanceType;
}
@end
//
单例的方式的调试
- (void)GCDOnce {
CFAbsoluteTime startTime =
CFAbsoluteTimeGetCurrent();
for (int
i = 0; i <
100000; i ++) {
FormatterManger *formatter = [FormatterManger
formatterManger];
}
CFAbsoluteTime stopTime =
CFAbsoluteTimeGetCurrent();
NSLog(@"%s :%f",__func__,stopTime
- startTime);
}
第三种:分类方法
分类.h
#import
<Foundation/Foundation.h>
@interface NSDateFormatter (CategoryFormatter)
+ (instancetype)shareDateFormatter;
@end
分类.m
#import
"NSDateFormatter+CategoryFormatter.h"
static
NSDateFormatter *instanceType =
nil;
@implementation NSDateFormatter (CategoryFormatter)
+ (instancetype)shareDateFormatter{
static
dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instanceType = [[NSDateFormatter
alloc]init];
});
return
instanceType;
}
@end
//
分类方法调试
- (void)category {
CFAbsoluteTime startTime =
CFAbsoluteTimeGetCurrent();
for (int
i = 0; i <
100000; i ++) {
NSDateFormatter *dateformatter = [NSDateFormatter
shareDateFormatter];
}
CFAbsoluteTime stopTime =
CFAbsoluteTimeGetCurrent();
NSLog(@"%s :%f",__func__,stopTime
- startTime);
}
三种方法输出结果:
第一种用的时间最长,第二种用的时间最短,第三种用的时间和第二种差不多,不过我一般使用第二种