做IOS好几年了,今天用单例这块,今天在单例出现了点小问题,(团队开发)
创建单例方法
第一种
static Singleton * _singleton;
@implementation Singleton
+ (instancetype)manager{
static dispatch_once_t onceToken;
// 一次函数
dispatch_once(&onceToken, ^{
if (_singleton == nil) {
_singleton = [[Singleton alloc]init];
}
});
return _singleton;
}
代码自己用可以;不严谨
第二种
+(instancetype) shareInstance{
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
_singleton = [[super allocWithZone:NULL] init] ;
}) ;
return _singleton ;
}
+(id) allocWithZone:(struct _NSZone *)zone
{
return [Singleton shareInstance] ;
}
-(id) copyWithZone:(struct _NSZone *)zone
{
return [Singleton shareInstance] ;
}
alloczone这个方法虽然被弃用,但在单例这块显示出他的优点,可以有效规避,同事不知道这是单例的情况下,使用alloc init方法
第三种
+(instancetype)myAlloc{
return [super allocWithZone:nil];
}
+(AlertViewSigleton *)mamager{
static dispatch_once_t onceToken;
// 一次函数
dispatch_once(&onceToken, ^{
if (_singleton == nil) {
_singleton = [[AlertViewSigleton myAlloc]init];
}
});
return _singleton;
}
+(instancetype)alloc{
NSAssert(0, @"这是一个单例对象,请使用+(AlertViewSigleton *)mamager方法");
return nil;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
return [self alloc];
}
-(id)copy{
NSLog(@"这是一个单例对象,copy将不起任何作用");
return self;
}
+(instancetype)new{
return [self alloc];
}
网友评论