单例模式的安全创建法

单例外部环境不可控,内部可控。所有要保证单例唯一,就只有在其.m内实现。

使用情景

高频率去生产一个对象,然后又释放。让多个不相关的类共享数据。

创建单例

.h

//
//  SafeSingleton.h
//  OC基础
//
//  Created by FYJMac on 2018/5/2.
//  Copyright © 2018年 FYJMac. All rights reserved.
//

#import 

@interface SafeSingleton : NSObject
//创建或获取单例对象
+ (instancetype)sharedSafeSingleton;
//注销单例对象
- (void)cancelShare;

@end

.m

//
//  SafeSingleton.m
//  OC基础
//
//  Created by FYJMac on 2018/5/2.
//  Copyright © 2018年 FYJMac. All rights reserved.
//

#import "SafeSingleton.h"

@implementation SafeSingleton

static SafeSingleton *singleton;

//load是第一次加载该类时触发(不管有没有调用);initialize时第一次使用该类时触发
+ (void)initialize
{
    [SafeSingleton sharedSafeSingleton];
}

+ (instancetype)sharedSafeSingleton
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        singleton = [[SafeSingleton alloc] init];
    });
    return singleton;
}

//防止被创建多个
+ (instancetype)alloc
{
    if (singleton) {
        //抛出一个异常,通常是在写框架的时候用到
        NSException *exception = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Singleton indtance." userInfo:nil];
        [exception raise];
    }
    return [super alloc];
}


- (void)cancelShare
{
    singleton = nil;
}

你可能感兴趣的:(单例模式的安全创建法)