扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1.基本概念
成都创新互联公司成立于2013年,先为红安等服务建站,红安等地企业,进行企业商务咨询服务。为红安企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问。
注意:苹果大量使用了此模式。例如:[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
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流