一、使用dispatch_once();
变量使用static,一是因为在block中修改变量的引用时,变量只能是block变量或者是static静态变量,static在函数内部使用,多次执行该函数,只分配一份内存存储区。
+(NetWorkManager *)sharedInstance
{
static NetWorkManager*networkManager;
static dispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
networkManager = [[NetWorkManageralloc] init];
});
return networkManager;
}
dispatch_once()函数用来标记函数内的代码只执行一次。
二、通过类方法和static变量来实现
static MySingleton *singleton = nil;//使用静态变量,供方法使用
+(MySingleton *)sharedInstance
{
@synchronized(self)//线程安全
{
if (singleton == nil) {
singleton = [[super alloc]init];//使用super alloc,因为该类的allocWithZone被重写。
//singleton = [[super allocWithZone:NULL] init];
}
}
return singleton;
}
+ (id) allocWithZone:(NSZone *)zone //第三步:重写allocWithZone方法
{
return [self sharedInstance];
}
- (id) copyWithZone:(NSZone *)zone //第四步
{
return self;
}
以上两张方法都可以保证线程安全,方法二摘自ios设计模式解析。