美文网首页
单例模式

单例模式

作者: weyan | 来源:发表于2018-11-26 08:29 被阅读0次

    一、介绍

    介绍

    二、单例模式代码实现

    //创建一个类XMGTool,实现单例
    --------------------------XMGTool.h文件--------------------------
    #import <Foundation/Foundation.h>
    
    @interface XMGTool : NSObject<NSCopying,NSMutableCopying>
    
    //提供类方法,方便外界访问
    /*
     规范: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 <Foundation/Foundation.h>
    
    @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
    

    相关文章

      网友评论

          本文标题:单例模式

          本文链接:https://www.haomeiwen.com/subject/vliwgftx.html