Objective-C的单例实现

 在这些设计模式中,我发现自己最需要用到的是Singleton模式。在程序中,我需要一系列的对象,他们每一个内部都包含有一组变量和功能,是静态的,而且整个程序都只需要拥有一个该类的对象。
    例如:
    1.控制程序执行的命令器
    2.管理数据库
    3.音效控制
    4.文件处理

单例是在程序声明周期里 有且仅有 被实例化过一次的类。为确保实例化的唯一,利用类的 类(static)方法来生成和访问对象。

至此,你便可以在程序中任何地方访问类的单例对象,因为只实例化唯一的一次,所以,并不用 alloc、init、autorelease初始化方法。

Singleton 模式的实现

在objective-C中,实现Singleton模式,只需实现以下四个步骤:

1.  为 Singleton Object 实现一个静态实例,并初始化,然后设置成nil;

2. 实现一个实例构造方法 (通常命名为 sharedInstance 或者 sharedManager) 检查上面声明的静态实例是否为nil,如果是,则新建并返回一个本类实例;

3. 重写allocWithZone: 方法,用来保证当其他人直接使用 alloc 和init 试图获得一个新实例的时候,不会产生一个新的实例。

4. 适当地实现  allocWithZone,  copyWithZone,  release 和 autorelease。

+ (id)sharedInstance
{
  static dispatch_once_t pred = 0;
  __strong static id _sharedObject = nil;
  dispatch_once(&pred, ^{
    _sharedObject = [[self alloc] init]; // or some other init method
  });
  return _sharedObject;
}

The block given to dispatch_once will, as the name implies, only ever be called once. This will ensure only one instance is created. It's also fast and thread safe: no synchronized or nil checks required.

We can go one step further and wrap this up in a convenient macro. Now all you need to do is this:

+ (id)sharedInstance
{
  DEFINE_SHARED_INSTANCE_USING_BLOCK(^{
    return [[self alloc] init];
  });
}

参考 http://lukeredpath.co.uk/blog/2011/07/01/a-note-on-objective-c-singletons/

原文地址:https://www.cnblogs.com/codings/p/3567213.html