1 .h文件:
sharedMyOperationBySynchronized是互斥鎖方式創(chuàng)建單例的類方法
sharedMyOperationByDispatchOnce是GCD一次性執(zhí)行方式創(chuàng)建單例的類方法:
@interface MyOperation : NSOperation
+ (instancetype)sharedMyOperationBySynchronized;
+ (instancetype)sharedMyOperationByDispatchOnce;
@end
2 .m文件:
@implementation MyOperation
+ (instancetype)sharedMyOperationBySynchronized{
static id _instanceType = nil;
@synchronized (_instanceType) {
_instanceType = [[MyOperation alloc]init];
}
return _instanceType;
}
+ (instancetype)sharedMyOperationByDispatchOnce{
static id _instanceType = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instanceType = [[MyOperation alloc]init];
});
return _instanceType;
}
@end
3 演示代碼:
#import "ViewController.h"
#import "MyOperation.h"
#define ENOUGH_LARGE_NUMBER 10000
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
將兩種獲取單例對(duì)象分別放在For循環(huán)中,獲取For循環(huán)前的精確時(shí)間,再獲取For循環(huán)執(zhí)行完畢后的精確時(shí)間,對(duì)比兩種方式的效率
*/
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
CFAbsoluteTime startTimeSync = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < ENOUGH_LARGE_NUMBER; i ++) {
MyOperation *operationBySynchronized = [MyOperation sharedMyOperationBySynchronized];
}
CFAbsoluteTime endTimeSync = CFAbsoluteTimeGetCurrent();
CFAbsoluteTime startTimeGCD = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < ENOUGH_LARGE_NUMBER; i ++) {
MyOperation *operationByDispatchOnce = [MyOperation sharedMyOperationByDispatchOnce];
}
CFAbsoluteTime endTimeGCD = CFAbsoluteTimeGetCurrent();
NSLog(@"sharedMyOperationBySynchronized:%f",endTimeSync - startTimeSync);
NSLog(@"sharedMyOperationByDispatchOnce:%f",endTimeGCD - startTimeGCD);
}
@end
4 輸出結(jié)果:
2016-06-09 20:23:22.712 07-單例效率比較[2166:395895] sharedMyOperationBySynchronized:0.012765
2016-06-09 20:23:22.712 07-單例效率比較[2166:395895] sharedMyOperationByDispatchOnce:0.000792
For循環(huán)的次數(shù)越大,體現(xiàn)越明顯
Compare.png