单例的使用以及制定
- 我们先来了解何为单利:
单例模式是一种常用的软件设计模式,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源,如果希望系统中某个类的对象只能存在一个,单例模式是最好的解决方案。iOS中最常见的单例就是UIApplication。
- 单利的应用场景:
音频播放,背景音乐!硬件资源:加速器、[UIScreen mainScreen]
sharedXX, mainXXX
- 优点:可以阻止其他对象实例化单例对象的副本,从而确保所有对象都访问唯一实例
- 缺点:单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会在应用程序终止后才会被释放
- 温馨提示:只有确实需要唯一使用的对象才需要考虑单例模式,不要滥用单例
- 下边说下如何去创建一个单例:
(1)重写allocWithZone,用dispatch_once实例化一个静态变量
(2) 写一个+sharedXXX方便其他类调用 ,在iOS中,所有对象的内存空间的分配,最终都会调用allocWithZone方法,如果要做单例,需要重写此方法。
- 下边是代码示例:
+ (id)allocWithZone:(struct _NSZone *)zone{
// dispatch_once是线程安全onceToken默认为0
static sharedObj * instance;
static dispatch_once_t onceToken;
// dispatch_once宏可以保证块代码中的指令只被执行一次
dispatch_once(&onceToken, ^{
// 在多线程环境下,永远只会被执行一次,instance只会被实例化一次
instance = [super allocWithZone:zone];
});
return instance;
}
- 下边这个方法是在外部要调用的,所以要在.h文件做声明
+ (instancetype)sharedInstance{
// 如果有两个线程同时实例化,很有可能创建出两个实例来
return [[self alloc] init];
}
网友评论