//
// DataManager.m
// Demo_dispatch_once
//
// Created by 麦子 on 15/7/15.
// Copyright (c) 2015年 麦子. All rights reserved.
//
#import "DataManager.h"
@implementation DataManager
@synthesize name;
/**
1 线程安全
2 很好满足静态分析器要求
3 和自动引用计数(ARC)兼容
4 仅需要少量代码
*/
static DataManager *sharedDataManagerInstance = nil;
static dispatch_once_t predicate;
// 单利模式,dispatch_once 只会执行一次。
+(DataManager *) sharedDataManager{
dispatch_once(&predicate, ^{
// sharedDataManagerInstance = [[DataManager alloc] initPrivate];
sharedDataManagerInstance = [[DataManager alloc] init];
});
return sharedDataManagerInstance;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone { // 初始化
if (sharedDataManagerInstance == nil) {
sharedDataManagerInstance = [super allocWithZone:zone];
}
return sharedDataManagerInstance;
}
//- (instancetype) init{
// NSLog(@"init 不再处理");
// return nil;
//};
//- (instancetype) initPrivate{
// self = [super init];
// if (self) {
// self.name = @"我就被执行一次,数据初始化可用我来处理";
// }
// return self;
//}
@end
DataManager *entity2 = [DataManager sharedDataManager];
NSLog(@"entity2---%@",entity2);
DataManager *entity3 = [[DataManager alloc] init];
NSLog(@"entity3---%@",entity3);
打印结果如下:
2015-07-15 14:52:40.604 Demo_dispatch_once[2637:120011] entity2---<DataManager: 0x7fc7ba65f8b0>
2015-07-15 14:52:40.604 Demo_dispatch_once[2637:120011] entity3---<DataManager: 0x7fc7ba65f8b0>
这样,不管是用 shared的方法,还是习惯的init的方法,我们总是同一个对象。
对象是静态变量,如果赋值一次后,后面直接判断一下就好了。
dispatch_once 用这个只是线程的保护。