NSDateFormatter优化以及测试方法CFAbsoluteTimeGetCurrent()

本文介绍如何通过单例和分类方法优化NSDateFormatter的性能,避免因频繁实例化导致的App卡顿问题。通过对比测试,展示了不同方法的效率差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过度的创建NSDateFormatter用于NSDateNSString之间转换,会导致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);
   
   
}

三种方法输出结果:


第一种用的时间最长,第二种用的时间最短,第三种用的时间和第二种差不多,不过我一般使用第二种
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值