• 单例模式


      - 在IOS中有一个很重要的设计模式,那就是单例模式。何为单例模式呢?那就是至始至终它的内存地址都是只有一份。

      - 单例模式的作用

        - 可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问
        - 从而方便地控制了实例个数,并节约系统资源
     
      - 单例模式的使用场合
      - 在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次)

    实现

      - 普通方式:

    static id _instance;
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone
    {
        // 加入同步锁,防止多线程的情况下,同时进入创建实例
        @synchronized(self){
            if (_instance == nil) {
                _instance = [super allocWithZone:zone];
            }
            return _instance;
        }
    }
    
    + (instancetype)sharedIntance
    {
        @synchronized(self){
            if (_instance == nil) {
                _instance = [[self alloc] init];
            }
        }
        return _instance;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return _instance;
    }

      - GCD形式创建

    static id _instance;
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instance = [super allocWithZone:zone];
        });
        return _instance;
    }
    
    + (instancetype)sharedInstance
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instance = [[self alloc] init];
        });
        return _instance;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return _instance;
    }

      - 利用宏的形式创建,方便以后直接调用 

    // .h文件
    #define  SAMSingletonH(name)  + (instancetype)shared##name;
    
    // .m文件
    #define  SAMSingletonM(name)  
    
    static id _instance; 
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone 
    { 
        static dispatch_once_t onceToken; 
        dispatch_once(&onceToken, ^{  
            _instance = [super allocWithZone:zone]; 
        }); 
        return _instance; 
    } 
      
    + (instancetype)shared##name  
    {  
        static dispatch_once_t onceToken; 
        dispatch_once(&onceToken, ^{  
            _instance = [[self alloc] init]; 
        }); 
        return _instance; 
    } 
     
    - (id)copyWithZone:(NSZone *)zone 
    { 
        return _instance; 
    }
  • 相关阅读:
    正则判断是否为纯数值
    前后端加密解密crypto.js
    小程序使用iconfont字体图标
    LeetCode-Combination Sum II
    LeetCode-Combination Sum
    Google 2013 campus test-R1
    Google Codejam
    LeetCode-Count and Say
    LeetCode-Binary Tree Level Order Traversal II
    LeetCode-Binary Tree Level Order Traversal
  • 原文地址:https://www.cnblogs.com/samyangldora/p/4631511.html
Copyright © 2020-2023  润新知