一、单例模式:
单例模式不需要传递任何参数,就有效地解决了不同代码间的数据共享问题。单例类是一个非常重要的概念,因为它们表现出了一种十分有用的设计模式。单例类的应用贯穿于整个iOS的SDK中。例如,UIApplication类有一个方法叫sharedApplication,从任何地方调用这个方法,都将返回与当前正在运行的应用程序相关联的UIApplication实例。除了这个,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(应用程序设置) 、NSURLCache(请求缓存)、NSHTTPCookieStorage(应用程序cookies池)都是系统单例;单例类保证了应用程序的生命周期中有且仅有一个该类的实例对象,而且易于外界访问。
二、单例模式的要点:
1、某个类只能有一个实例。
2、它必须自行创建这个实例。
3、它必须自行向整个系统提供这个实例。
三、单例模式的优点:
1、实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。
2、灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程IOS中的单例模式。
四、创建一个单例至少需要四个步骤:
1、为单例对象实现一个静态实例,并初始化,然后设置成nil。
2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例。
3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实例的时候不产生一个新实例。
4、适当实现copyWithZone。
Demo:创建一个单例类SingletonClass,定义它的属性和方法。
.h
#import <Foundation/Foundation.h>
@interface SingletonClass : NSObject
@property (assign, nonatomic)int age;//定义一个属性
//单例方法
+(SingletonClass *)sharedInstance;
@end
.m
#import "SingletonClass.h"
@implementation SingletonClass
//1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
static SingletonClass *manager = nil;
//2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
+(SingletonClass *)sharedInstance{
@synchronized(self) {
if(manager == nil) {
manager = [[SingletonClass alloc] init];
}
}
return manager;
}
//3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实例的时候不产生一个新实例,
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){
if (!manager) {
manager = [super allocWithZone:zone]; //确保使用同一块内存地址
return manager;
}
return nil;
}
}
//4、适当实现copyWithZone,确保copy对象也是唯一
- (id)copyWithZone:(NSZone *)zone{
return self;
}
//初始化方法,初始化自己的属性
- (id)init{
@synchronized(self) {
if (self = [super init]){
self.age = 10;
return self;
}
return nil;
}
}
@end
使用:#import "SingletonClass.h"
SingletonClass *singleton = [SingletonClass sharedInstance];
singleton.age = 15;