单例的完整写法

  • 有朋友还在单例的问题上纠结,如何写才算完备,今天在这里写一写。
  • 注意:单例一但创建,整个App的使用过程中都不会被释放,所以要谨慎使用。
#import 

@interface SUNTool : NSObject
+(instancetype)shareTool;
@end

#import "SUNTool.h"
@implementation SUNTool

//0.提供全局变量
static SUNTool *_instance;

//1.alloc-->allocWithZone
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    //加互斥锁解决多线程访问安全问题
//    @synchronized(self) {
//        if (_instance == nil) {
//            _instance = [super allocWithZone:zone];
//        }
//    }
    
    //本身就是线程安全的
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

//2.提供类方法
+(instancetype)shareTool
{
    return [[self alloc]init];
}

//3.严谨
-(id)copyWithZone:(NSZone *)zone
{
    return _instance;
}

-(id)mutableCopyWithZone:(NSZone *)zone
{
    return _instance;
}

你可能感兴趣的:(单例的完整写法)