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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。