zoukankan      html  css  js  c++  java
  • iOS开发笔记2:单例模式(singleton)

        每一个app有且仅有一个UIApplication,类似UIApplication“ [UIApplication sharedApplication]”这种一个类有且仅有唯一实例的设计即单例模式。

    单例设计及要点

        一个单例类设计如下图所示

        其中有几点要注意:

         (1)实例需要用static,防止在其他文件中被修改;

         (2)鉴于开发习惯,所以类方法都是以“sharedXXX"命名,并在其中进行唯一一次实例化;

         (3)alloc时会调用allocWithZone方法,为了保持单例,需要重写该方法;

         (4)检查两次实例是否为nil是有不同含义的,第一次检查实例是否为nil也就是常说的双重检查锁,避免重复加锁。因为当第一次实例化后,后续每次获取实例时没有必要进行加锁等操作,直接返回实例即可,第二次检查实例是否为nil很明显就是为了保证实例唯一了。

         (5)加锁@synchronized的意义在于保证线程安全,避免_instance为nil时刚好多个线程同时获取实例,于是同时产生了多个实例。通过加锁来保证同一时刻只能有一个线程进行调用,确保单例;

         (6)为了防止copy时产生新的实例,同样对copyWithZone进行了重新,保证单例

    GCD方式实现单例

     GCD方式单例设计如下图所示

        

    static的作用

        static修饰全局变量的作用在于限制其作用域,使变量只在定义的源文件内有效。

        反之,如果我们去掉static的修饰,就可以在外部其他文件进行引用并修改变量,也就破坏单例了。

        

    MRC环境下使用单例

         如果是在MRC环境下使用单例,除了上述设计外还要进行一些重写,使对象引用计数永远为1

         

  • 相关阅读:
    JSP前三章测试改错
    实现文件上传
    Url和Uri的区别
    四套读写文件方案
    C++第一课
    数据聚合架构模式
    高并发怎么解决?
    为什么做不了软件架构师
    完整版go-mysql-elasticsearch安装步骤
    安装GO
  • 原文地址:https://www.cnblogs.com/colinhou/p/4516121.html
Copyright © 2011-2022 走看看