单例模式

一、介绍

单例模式_第1张图片
介绍

二、单例模式代码实现

//创建一个类XMGTool,实现单例
--------------------------XMGTool.h文件--------------------------
#import 

@interface XMGTool : NSObject

//提供类方法,方便外界访问
/*
 规范:share + 类名 |share |default + 类名
 */

+(instancetype)shareTool;
@end
--------------------------XMGTool.m文件--------------------------
#import "XMGTool.h"

@implementation XMGTool

//01 提供一个全局的静态变量(对外界隐藏)
static XMGTool *_instance;

//02 重写alloc方法,保证永远只分配一次内存
// 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;
}

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

//04 重写copy,对象方法,首先要创建对象
-(id)copyWithZone:(NSZone *)zone
{
    return _instance;
}

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

@end
----------------------------在外界调用--------------------------
- (void)viewDidLoad {
    [super viewDidLoad];

    //创建对象
    XMGTool *t1 = [[XMGTool alloc]init];
    
    XMGTool *t2 = [[XMGTool alloc]init];
    XMGTool *t3 = [XMGTool new];
    
    NSLog(@"\n%@\n%@\n%@\n%@\n%@",t1,t2,t3,[XMGTool shareTool],[t1 copy]);
    
}

三、单例的简介写法

//此方法中缺点,不能使用alloc init 或者copy.mutableCopy方法创建对象
-------------------------------XMGTool.h方法---------------------------
#import 

@interface XMGTool : NSObject

+(instancetype)shareTool;
@end
-------------------------------XMGTool.m方法---------------------------
#import "XMGTool.h"

@implementation XMGTool

+(instancetype)shareTool
{
    //01 提供静态变量
    static XMGTool * _instance;
    
    //02 一次性代码
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [self new];
    });
    
    return _instance;
}
@end

你可能感兴趣的:(单例模式)