ios 单例

2017-09-28  本文已影响13人  泛坷

做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];
}

感谢
https://www.2cto.com/kf/201412/362291.html

上一篇下一篇

猜你喜欢

热点阅读