1.基本概念

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问。

单例设计模式确保对于一个给定的类只有一个实例存在,这个实例有一个全局唯一的访问点。它通常采用懒加载的方式在第一次用到实例的时候再去创建它。

注意:苹果大量使用了此模式。例如:[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager],所有的这些方法都返回一个单例对象。


2.单例设计模式的适用情况

如果说创建一个对象会耗费很多系统资源,那么此时采用单例模式,因为只需要一个实例,会节省alloc的时间。

在IOS开发中,如果很多模块都要使用同一个变量,此时如果把该变量放入单例类,则所有访问该变量的调用变得很容易,否则,只能通过一个模块传递给另外一个模块,这样增加了风险和复杂度

3.单例实例

新建一个接口类Singleton继承于NSObject:

@interface Singleton : NSObject

+ (Singleton *) sharedInstance;

@end


在实现类中:

@implementation Singleton

//1.

static Singleton * sharedSingleton = nil;

+ (Singleton *) sharedInstance

{

//2.

if (sharedSingleton == nil) {

sharedSingleton = [[Singleton alloc] init];

}

return sharedSingleton;

}

@end

1.声明一个静态变量去保存类的实例,确保它在类中的全局可用性。

2.此方法只会执行一次,执行过后在整个生命周期不再执行,确保只有一个实例。

这种不能排除多线程的时候,同时调用出现的问题,所以为了安全起见我们可以进行改进。有2种思路来解决这一问题。

(1)使用关键字@synchronized进行加锁

@implementation Singleton


static Singleton * sharedSingleton = nil;

+ (Singleton *) sharedInstance

{

@synchronized(self)if{

if (sharedSingleton == nil) {

sharedSingleton = [[Singleton alloc] init];

}

return sharedSingleton;

}

}

@end

(2)使用Dispatch_once,在整个生命周期中,只会调用一次

@implementation Singleton


static Singleton * sharedSingleton = nil;

+ (Singleton *) sharedInstance

{

static dispatch_once_t once;

dispatch_once(&once,^{

sharedSingleton = [[Singleton alloc] init];

});

return sharedSingleton;

}

@end


这样在常用情况下都可以使用了。但这并不是一个“严格”的版本。具体情况参考这篇博文

http://blog.csdn.net/abel_tu/article/details/12836961