zoukankan      html  css  js  c++  java
  • 单例模式

      - 在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; 
    }
  • 相关阅读:
    ISAG协议中彩信支持的几种附件格式(河南电信)
    河南电信ISAG短信下行数据格式
    SQL中varchar和nvarchar有什么区别?
    通过一个很实用的例子让你学会TSQL编程的基本语法和思想
    在读取或者保存word时,程序捕获到word异常“word无法启动转换器mswrd632 wpc”
    工作基本搞定等待周五入职
    ClickOnce发布时,资源文件添加问题
    访问IIS元数据库失败
    一个随机产生中文简体字的一个类
    QQ抢车位外挂(续)
  • 原文地址:https://www.cnblogs.com/samyangldora/p/4631511.html
Copyright © 2011-2022 走看看