你的位置:首页 > 操作系统

[操作系统]IOS中的单例设计模式


  单例设计模式是IOS开发中一种很重要很常用的一种设计模式。它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例。下面是苹果官方文档中关于单例模式的图片:

 

  如图所示,左边的图是默认的多例模式,只要发送请求去创建对象,就会得到一个新的对象;而右侧的图是单例模式,发送多个请求创建对象,但是最后返回的始终是同一个。

  因为创建单例类的实例是在确保没有其他实例的情况下才创建的,并且在程序中使用的过程中始终是同一个实例,因此单例类可以作为提供一个全局访问资源的类,比如NSUserDefaults,我们可以通过它存储数据,它里面的数据就是全局的,无论在哪个类里面操作都是一样的。此外,一个单例类还可以防止调用者复制、保留或释放实例。因此,在开发的工程中可以根据需要来创建不同的单例类。

  单例的创建分Non-ARC(非ARC)和ARC+GCD,后者现在用的比较广泛,它保证了线程的安全,满足了静态分析器的要求,还兼容了ARC,代码如下:

+(AccountManager *)sharedManager{  static AccountManager *sharedAccountManagerInstance = nil;  static dispatch_once_t predicate;  dispatch_once(&predicate, ^{    sharedAccountManagerInstance = [[self alloc] init];  });  return sharedAccountManagerInstance;}

  代码分析:

  通过这个类方法,可以得到当前类的单例对象。

  在方法中先声明了一个实例,并初始化为nil,前面的static关键字可以保证只执行一次为nil的操作。dispatch_once_t是多线程中的,保证只执行一次。dispatch_once这个函数用于检查该代码块是否已经被调用过,通过它不仅可以保证块里面初始化的代码仅被运行一次,还能保证线程的安全。

  单例的使用非常简单,可以通过上面的类方法来创建任何你想要的单例类,只需要把AccountManager修改为你想要创建类的名称,然后通过下面代码来创建实例即可:

AccountManager *manager = [AccountManager sharedManager];