ios-单例模式

一、什么是单例模式:
1、就我本身理解而言,我认为的单例:单例在整个工程中,就相当于一个全局变量,就是不论在哪里需要用到这个类的实例变量,都可以通过单例方法来取得,而且一旦你创建了一个单例类,不论你在多少个界面中初始化调用了这个单例方法取得对象,它们所有的对象都是指向的同一块内存存储空间(即单例类保证了该类的实力对象是唯一存在的一个。
2、“单例模式”是我们在iOS中最常使用的设计模式之一。单例模式不需要传递任何参数,就有效地解决了不同代码间的数据共享问题。单例类是一个非常重要的概念,因为它是一种十分有用的设计模式。单例类的应用贯穿于整个iOS的SDK中。例如,UIApplication类有一个方法叫sharedApplication,从任何地方调用这个方法,都将返回与当前正在运行的应用程序相关联的UIApplication实例。除了这个,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(持久化存储数据) 、NSURLCache(请求缓存)、NSHTTPCookieStorage(应用程序cookies池)都是系统单例。
3、单例类保证了应用程序的生命周期中有且仅有一个该类的实例对象,而且易于外界访问。
二、单例模式的优缺点:
优点:
1、单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
2、如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
3、单例模式因为类控制了实例化过程,所以类可以更加灵活修改实例化过程。
缺点:
1、单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会在应用程序终止后才会被释放。
2、单例类无法继承,因此很难进行类的扩展。
3、单例不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
三、单例模式的实现步骤:
1、首先必须创建一个全局实例,通常存放在一个全局变量中,此全局变量设置为nil
2、提供工厂方法对该全局实例进行访问,检查该变量是否为nil,如果nil就创建一个新的实例,最后返回全局实例
3、全局变量的初始化在第一次调用工厂方法时会在+allocWithZone:中进行,所以需要重写该方法,防止通过标准的alloc方式创建新的实例
4、为了防止通过copy方法得到新的实例,需要实现-copyWithZone方法
5、只需在此方法中返回本身对象即可,引用计数也不需要进行改变,因为单例模式下的对象是不允许销毁的,所以也就不用保留
6、因为全局实例不允许释放,所以在MRC 的项目里retain,release,autorelease方法均需重写

#import "Tools.h"

@implementation Tools
// 创建静态对象 防止外部访问
static Tools *_instance;
// 为了使实例易于外界访问 我们一般提供一个类方法
// 类方法命名规范 share类名|default类名|类名
+(instancetype)shareTools{
   //return _instance;
   // 最好用self 用Tools他的子类调用时会出现错误
   return [[self alloc]init];
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
//    @synchronized (self) {
//        // 为了防止多线程同时访问对象,造成多次分配内存空间,所以要加上线程锁
//        if (_instance == nil) {
//            _instance = [super allocWithZone:zone];
//        }
//        return _instance;
//    }
   // 也可以使用一次性代码
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
       if (_instance == nil) {
           _instance = [super allocWithZone:zone];
       }
   });
   return _instance;
}
-(id)init{
   @synchronized(self){
       if (self = [super init]) {
       }
       return self;
   }
}
// 为了严谨,也要重写copyWithZone 和 mutableCopyWithZone
-(id)copyWithZone:(NSZone *)zone
{
   return _instance;
}
-(id)mutableCopyWithZone:(NSZone *)zone
{
   return _instance;
}

你可能感兴趣的:(ios-单例模式)