zoukankan      html  css  js  c++  java
  • 浅谈iOS中的单例模式

    iOS中的单例模式

        就我本身理解而言,我认为的单例:单例在整个工程中,就相当于一个全局变量,就是不论在哪里需要用到这个类的实例变量,都可以通过单例方法来取得,而且一旦你创建了一个单例类,不论你在多少个界面中初始化调用了这个单例方法取得对象,它们所有的对象都是指向的同一块内存存储空间(即单例类保证了该类的实力对象是唯一存在的一个).

        “单例模式”是我们在iOS中最常使用的设计模式之一。单例模式不需要传递任何参数,就有效地解决了不同代码间的数据共享问题。单例类是一个非常重要的概念,因为它们表现出了一种十分有用的设计模式。单例类的应用贯穿于整个iOS的SDK中。例如,UIApplication类有一个方法叫sharedApplication,从任何地方调用这个方法,都将返回与当前正在运行的应用程序相关联的UIApplication实例。除了这个,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(持久化存储数据) 、NSURLCache(请求缓存)、NSHTTPCookieStorage(应用程序cookies池)都是系统单例;

    单例类保证了应用程序的生命周期中有且仅有一个该类的实例对象,而且易于外界访问。

        单例模式的优点:

     1.实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。
     2.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程。
        单例类的实现方法:
        (1).通过加线程锁进行实现:
     比如创建了一个DBManager的类
     +(DBManager *)sharedManager;    (.h文件中)
     
     .m文件中的实现:
     +(DBManager *)sharedManager{
      Static DBManager *manager = nil;
      @synchronized(self){
      if(manager == nil){
        manager = [[DBManager alloc]init];
         }
       }
      return manager;
    }
     
     
        (2).通过GCD实现单例方法:
      +(DBManager *)sharedManager;    (.h文件中)
     
     .m文件中的实现:
     +(DBManager *)sharedManager{
      Static DBManager *manager = nil;
          static dispatch_once_t token;
          dispatch_once(&token,^{
                  if(manager == nil){
               manager = [[DBManager alloc]init];
            }
       } );
      return manager;
    }
     
         重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
    +(id)allocWithZone:(NSZone *)zone{
        @synchronized(self){
            if (!manager) {
                manager = [super allocWithZone:zone]; //确保使用同一块内存地址
                return manager;
            }
            return nil;
        }
    }

        适当实现copyWithZone,release和autorelease
    - (id)init;
    {
        @synchronized(self) {
            if (self = [super init]){
                return self;
            }
            return nil;
        }
    }
     
     
  • 相关阅读:
    【pygame游戏编程】第二篇-----移动图像
    【pygame游戏编程】第五篇-----动画显示
    【pygame游戏编程】第四篇-----打字测速游戏
    【pygame游戏编程】第一篇-----创建一个窗口
    pygame编程之font模块
    pygame编组(精灵组)Group中的常用方法介绍
    javascript遍历对象的属性
    Spring中的@ImportResource
    SpringBoot中的@ConfigurationProperties
    开源协议是什么?有哪些?如何选择?
  • 原文地址:https://www.cnblogs.com/MasterPeng/p/5000516.html
Copyright © 2011-2022 走看看