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

    单例模式

     

    目录

    • 概述——对单例模式的理解
    • OC上的单例模式
    • 多线程中的单例模式

    线程安全实现一

    线程安全苹果官方实现

    使用GCD实现单例模式(推荐使用)

    • 单例模式的运用

     

    概述——对单例模式的理解 

     

    OC上的单例模式

    @implementation Singleton

    static Singleton *singleton;

    +(id)sharedInstance{

      if(!singleton){

        singleton = [[Singleton alloc] init];

      }

      return singleton;

    }

    @end

     

    多线程中的单例模式

    线程安全实现一

    +(id)sharedInstance{

      @synchronized(self){

      if(!singleton){

        singleton = [[Singleton alloc] init]; 

      }

      }

      return singleton;

    }

    线程安全苹果官方实现

    +(id)sharedInstance{

      @synchronized(self){

      if(singleton == nil){

        [[self alloc] init];  //assignment not done here

      }

      }

    }

    +(id)allocWithZone:(NSZone *)zone{

      @synchronized(self){

        if(singleton == nil){

          singleton == [super allocWithZone:zone];

          return singleton;  //assignment and return on first allocation

        }

      }

      return nil;  //on subsequent allocation attempts return nil

    }

    -(id)copyWithZone:(NSZone *)zone{

      return self;

    }

    -(id)retain{

      return self;

    }

    -(unsigned)retainCount{

      return UINT_MAX;  //denotes an object that cannot be released

    }

     -(void)release{

    }

    -(id)autorelease{

      return self;

    }

    注释

    使用@synchronized( )指令可以锁住在线程中执行的某一个代码块

    @synchronized()指令的唯一参数可以使用任何OC对象,包括self。这个对象就是我们所谓的信号量

    最安全的是,在应用程序进入多线程之前,为所有需要互斥的创建互斥信号量

    使用GCD实现单例模式(推荐使用)

    + (IQKeyboardManager*)sharedManager

    {

    //Singleton instance

    static IQKeyboardManager *kbManager;

    //Dispatching it once.

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{ 

    //  Initializing keyboard manger.

            kbManager = [[self alloc] init];

    });

    //Returning kbManager.

    return kbManager;

    }

    -(id)init

    {

    if (self = [super init])

        { 

            static dispatch_once_t onceToken;

            dispatch_once(&onceToken, ^{

        }

      }

    }

     

    单例模式的运用

     

  • 相关阅读:
    POI实现Excel导入数据库数据
    POI对Excel进行读取操作,工具类,便于操作数据
    HAProxy-1.8.20 根据后缀名转发到后端服务器
    Haproxy-1.8.20 编译安装:
    Soat控制HaProxy 动态增减服务器
    Haproxy-1.8.20 根据路径(URI)转发到后端不同集群
    Ansible User 模块添加单用户并ssh-key复制
    Ansible-playbook 安装redis
    二进制安装mysql-5.7.28
    编译安装 nginx -1.14.2
  • 原文地址:https://www.cnblogs.com/IOS-Developer/p/4183911.html
Copyright © 2011-2022 走看看