1.简介##
NSDateFormatter
是系统提供的一个用于时间格式化的类,可是每次创建这个类的来做时间转换的消耗却是很大的,这个时候就需要程序猿来进行优化.
2.普通的优化方法###
我们自定义一个继承自NSDateFormatter
的类,然后将这个类写成一个单例,这个时候内存的问题基本上就解决了.
+ (instancetype)dateFormatter {
static id _instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [WLDateFormatter new];
});
return _instance;
}
写成单例了就会造成一个线程访问安全问题,根据苹果官方文档介绍,NSDateFormatter
并非是线程安全的,也就说如果多线程同时访问我们的这个单例类就会出现问题,造成crash.
3.线程安全的NSDateFormatter
###
给每个线程创建一个NSDateFormatter
的实例,这个实例保存到线程的threadDictionary
中
static NSString *const kCurrentDateFormatter = @"currentDateFormatter";
+ (instancetype)dateFormatter {
NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary;
WLDateFormatter *dateFormatter = threadDict[kCurrentDateFormatter];
if (!dateFormatter) {
@synchronized (self) {
if (!dateFormatter) {
dateFormatter = [WLDateFormatter new];
threadDict[kCurrentDateFormatter] = dateFormatter;
return dateFormatter;
}
return dateFormatter;
}
}
return dateFormatter;